blyang 你长的很好看啊~
PHP 配置文件管理
发表于: | 分类: 默认分类 | 评论:0 | 阅读: 479

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脚本会初始化项目,将修改的文件覆盖
    

评论已关闭

TOP