Yii目录优化

本文介绍了如何优化Yii框架的目录结构,以便在开发、测试和生产环境中轻松切换配置。通过创建独立的环境配置目录,并结合Linux环境变量,实现了在不修改代码的情况下进行环境部署。在Docker部署时,可以在docker-compose.yaml文件中设置环境变量YII_ENV,确保每次部署都能应用正确的环境配置。
摘要由CSDN通过智能技术生成

1、背景

Yii默认提供的目录结构是没有dev/test/prod环境划分的,这将导致一个问题,就是在开发环境部署到测试环境、测试环境部署到生产环境的时候需要调整配置文件,修改mysql/redis等服务的地址和端口号。

<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/../../vendor/yiisoft/yii2/Yii.php';
require __DIR__ . '/../../common/config/bootstrap.php';
require __DIR__ . '/../config/bootstrap.php';

$config = yii\helpers\ArrayHelper::merge(
    require __DIR__ . '/../../common/config/main.php',
    require __DIR__ . '/../../common/config/main-local.php',
    require __DIR__ . '/../config/main.php',
    require __DIR__ . '/../config/main-local.php'
);

(new yii\web\Application($config))->run();

大家可以看到,这是Yii默认生成的入口文件,mysql/redis的配置信息在common/config/main-local.php这个文件中,每次部署到测试环境,都需要修改这个文件把正确的host调整过来,因此对于部署是很不方便的。

本文推荐一种目录结构,可以同时容纳dev/test/prod甚至更多的环境配置,通过入口文件,指定要使用的是哪套环境,便于部署。

2、新目录结构

├── backend
│   ├── config
│   │   ├── dev
│   │   ├── prod
│   │   └── test
├── common
│   ├── config
│   │   ├── dev
│   │   ├── prod
│   │   └── test
├── console
│   ├── config
│   │   ├── dev
│   │   ├── prod
│   │   └── test
├── frontend
    ├── config
        ├── dev
        ├── prod
		└── test

2.1 入口配置文件的修改

有3个配置入口需要修改,如下:

  • console控制台入口:/yii
  • backend后台入口:/backend/web/index.php
  • frontend前台入口:/frontend/web/index.php

修改的内容大同小异,我们以backend为例:

<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/../../vendor/yiisoft/yii2/Yii.php';
require __DIR__ . '/../../common/config/bootstrap.php';
require __DIR__ . '/../config/bootstrap.php';

//配置文件路径要加入环境常量,用于获取对应环境的配置文件
$config = yii\helpers\ArrayHelper::merge(
    require __DIR__ . '/../../common/config/main.php',
    require __DIR__ . '/../../common/config/'. YII_ENV .'/main.php',
    require __DIR__ . '/../config/main.php',
    require __DIR__ . '/../config/'. YII_ENV .'/main.php'
);

(new yii\web\Application($config))->run();

从此以后,每次部署以后,只要改变入口脚本的YII_ENV的值就可以实现环境的切换,但是这还是不够好,有一种方法可以实现代码0修改实现环境的切换,这个我们等会儿再讲。

2.2 公共main文件

除了index.php文件之外还需要修改config/main.php这个文件,调整路径,需要修改的文件如下:

  • /bankend/config/main.php
  • /frontend/config/main.php
  • common/config/main.php
  • console/config/main.php

我们还是以backend为例,修改后的文件如下:

<?php
$params = array_merge(
    require __DIR__ . '/../../common/config/params.php',
    require __DIR__ . '/../../common/config/'. YII_ENV .'/params.php',
    require __DIR__ . '/params.php',
    require __DIR__ . '/' . YII_ENV .'/params.php'
);

... ...

3、不改代码实现环境切换

上述代码始终有缺陷,无法在不修改代码的情况下获取正确的环境配置,所以我推荐在入口脚本中读取linux环境变量来决定环境,如下:

<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', getenv("YII_ENV") === false ? "dev" : getenv("YII_ENV"));

... ...

因此你在生产服务器、测试服务器中需要调整一次环境变量,把YII_ENV写入到环境变量中,因为我一直使用的是容器部署,因此在部署容器的时候写入容器即可:

version: '3.2'

services:
  frontend:
    build: frontend
    ports:
      - 20080:80
    volumes:
      - ~/.composer-docker/cache:/root/.composer/cache:delegated
      - ./:/app
    #重点:容器运行后的注入环境变量
    environment:
      YII_ENV: dev
    networks:
      extnetwork:
        ipv4_address: 172.22.0.4

我们用docker-compose进行部署开发、测试、生产环境的时候,yaml文件是必须要有的,因此在yaml文件中指定YII_ENV是比较好的一个选择。

关注我的微信公众号,更多文章推送不遗漏:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值