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
是比较好的一个选择。
关注我的微信公众号,更多文章推送不遗漏: