PHP 配置文件管理
PHP 配置文件抽离,保证开发只负责开发环境的配置。理想情况是将开发环境隔离,RD只负责开发环境,QA只负责测试环境,由运维负责生产环境。但是将配置管理做好,区分不同环境,保证灵活的配置,同时保证灵活的发布,是个比较大的工作量。这里整理了几种配置管理方法,供大家灵活选择。
配置文件管理的几种方式
- 项目文件中,将conf文件从git中ignore掉,项目发布之前,在生产服务器中手动修改对应conf文件
- 使用QConf或者Yaconf等扩展工具,管理项目配置文件,实现文件覆盖
- 在项目中增加debug.php和prod.php两种文件,由BaseController中修改调用的PHP文件名
- 在项目的Conf文件中,区分开发、测试、生产三套环境,在php.ini中增加环境变量,由环境变量控制发布时应该使用哪个配置文件
简单快速的配置文件管理
这几种文件管理方法,分别适应不同的管理阶段。第一种gitignore最粗糙,第三种增加了开发复杂度,在BaseController、BaseService等文件中,都需要对配置进行区分。第二种适用于研发人员众多时,分布式的配置管理和发布。
对于小公司来说,区分开发环境,并读取不同开发环境中的配置,则是一个比较合适的选择。具体文件夹路径如下
-- config
|- dev
|- config.php
|- test
|- config.php
|- prod
|- config.php
|- local
|- config.php
区分文件夹部署配置文件之后,在php.ini的文件中,增加环境的配置,在php.ini中区分开发机器、测试机器、生产机器。在项目代码中,提取php.ini环境变量信息,根据环境变量信息,确定应该抽取的配置文件的路径。
// 获取env环境变量信息
$env = ($tmpEnv = get_cfg_var('pro.env')) ? $tmpEnv : 'develop';
// 定义当前的环境变量
defined('ENV') or define('ENV', $env);
// 加载配置文件,可以这样写,当然也可以自行修改
require_once('/file_path/config/' . ENV . '/db.php');
TP框架方案
在php.ini中增加环境变量:local.env, 根据环境变量家在对应目录下的配置文件。原理是:利用框架中原有的config.php为入口,获取环境变量local.env,构建配置文件的路径。配置文件路径共分为四个:prod,test,dev,local。
在config.php中,增加如下代码,兼容Common和Module级别的Conf目录:
<?php
return get_cfg_var('local.env') === False ? [] : require(__DIR__ . sprintf('/%s/config.php', get_cfg_var('local.env')));
具体目录如下:
├── config.php #这里写入上述代码
├── dev
│ ├── config.php #真实配置
│ ├── db.php #子配置
│ └── index.html
├── index.html
├── local
│ ├── config.php
│ ├── db.php
│ └── index.html
├── prod
│ ├── config.php
│ ├── db.php
│ └── index.html
└── test
├── config.php
├── db.php
└── index.html
需要注意的是,由于TP框架支持子配置文件,通过config.php配置文件中的LOAD_EXT_CONFIG来加载,此时需要适配这个路径。由于TP3.2没有提供操作配置文件的钩子,所以需要在子配置文件中增加相对路径的配置,例如:
<?php
return array(
'LOAD_EXT_CONFIG' => 'dev/db', // 加载数据库配置文件
);
Yii框架方案
basic 版本
mkdir app/config/dev
mkdir app/config/prod
mkdir app/config/test
config中所有的配置文件 分别复制入相应配置文件夹中
并根据不同环境修改配置文件
//修改console入口文件
app/yii
文件头部加入
define('ENV',get_cfg_var('local.env') ?: 'dev');
将
$config = require __DIR__ . '/../config/console.php';
修改为
$config = require __DIR__ . '/../config/'.ENV.'/console.php';
//修改入口文件
app/web/index.php
文件头部加入
define('ENV',get_cfg_var('local.env') ?: 'dev');
将
$config = require __DIR__ . '/../config/web.php';
修改为
$config = require __DIR__ . '/../config/'.ENV.'/web.php';
advanced 版本
mkdir app/common/config/dev
mkdir app/common/config/prod
mkdir app/common/config/test
mkdir app/console/config/dev
mkdir app/console/config/prod
mkdir app/console/config/test
mkdir app/ #modules# /config/dev
mkdir app/ #modules# /config/prod
mkdir app/ #modules# /config/test
将common 和 自定义模块(例如frontend) config中的 *-local.php 文件移入相应环境配置文件夹中
并根据不同环境修改配置文件
因为非local文件(main.php,params.php)中的参数不受环境限制,为通用配置,所以非local文件无需移动
//修改模块(例如frontend)下main配置文件
app/ #modules# /main.php
将
$params = array_merge(
require __DIR__ . '/../../common/config/params.php',
require __DIR__ . '/../../common/config/params-local.php',
require __DIR__ . '/params.php',
require __DIR__ . '/params-local.php'
);
修改为
$params = array_merge(
require __DIR__ . '/../../common/config/params.php',
require __DIR__ . '/../../common/config/'.ENV.'/params-local.php',
require __DIR__ . '/params.php',
require __DIR__ . '/'.ENV.'/params-local.php'
);
//修改console入口文件
app/yii
文件头部加入
define('ENV',get_cfg_var('local.env') ?: 'dev');
将
$config = yii\helpers\ArrayHelper::merge(
require __DIR__ . '/common/config/main.php',
require __DIR__ . '/common/config/main-local.php',
require __DIR__ . '/console/config/main.php',
require __DIR__ . '/console/config/main-local.php'
);
修改为
$config = yii\helpers\ArrayHelper::merge(
require __DIR__ . '/common/config/main.php',
require __DIR__ . '/common/config/'.ENV.'/main-local.php',
require __DIR__ . '/console/config/main.php',
require __DIR__ . '/console/config/'.ENV.'/main-local.php'
);
//修改模块(例如frontend)入口文件
app/ #modules# /web/index.php
文件头部加入
define('ENV',get_cfg_var('local.env') ?: 'dev');
将
$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'
);
修改为
$config = yii\helpers\ArrayHelper::merge(
require __DIR__ . '/../../common/config/main.php',
require __DIR__ . '/../../common/config/'.ENV.'/main-local.php',
require __DIR__ . '/../config/main.php',
require __DIR__ . '/../config/'.ENV.'/main-local.php'
);
//考虑到 index-test.php 入口文件未在程序中应用,以上修改 均未处理index-test.php 文件
//另外,advanced版墙裂建议将项目根目录中的init文件头部加入exit;屏蔽掉此脚本文件
//执行init脚本会初始化项目,将修改的文件覆盖
评论已关闭