让thinkphp 5.1支持应用模式app_status配置
从thinkphp 5.0 配置应用模式的设置很简单,只需要几步就可以完成:
a. 在入库文件index.php写入定义:
$env = getenv('SYS_ENV'); // 根据自身情况修改环境变量 $env = empty($env) ? 'develop' : $env; empty($env) ? define('APP_STATUS', 'develop') : define('APP_STATUS', $env);
完整index.php入口文件代码参考:
<?php session_start(); // [ 应用入口文件 ] // 定义应用目录 define('APP_PATH', __DIR__ . '/../application/'); define('WEB_PATH', __DIR__); define('APP_DEBUG', true); $env = getenv('SYS_ENV'); // 根据自身情况修改环境变量 $env = empty($env) ? 'develop' : $env; $env = 'develop'; empty($env) ? define('APP_STATUS', 'develop') : define('APP_STATUS', $env); // 改变配置目录 define('CONF_PATH', __DIR__ . '/../config/'); // 加载框架引导文件 require __DIR__ . '/../thinkphp/start.php';
b. 然后配置下配置文件config.php, 修改app_status配置:
// 应用模式状态 'app_status' => 'config_' . APP_STATUS,
c. 最后增加几个环境下的配置文件 config_develop.php , config_pre.php , config_release.php 等
以config_develop.php 为例,配置参考代码:
<?php /* * 测试环境配置 */ return [ // +---------------------------------------------------------------------- // | 应用设置 // +---------------------------------------------------------------------- // 应用调试模式 'app_debug' => false, // 应用Trace 'app_trace' => false, // +---------------------------------------------------------------------- // | 数据库设置 // +---------------------------------------------------------------------- 'database' => [ // 数据库类型 'type' => 'mysql', // 数据库连接DSN配置 'dsn' => '', // 服务器地址 'hostname' => '127.0.0.1', // 数据库名 'database' => 'workdata', // 数据库用户名 'username' => 'root', // 数据库密码 'password' => 'root', // 数据库连接端口 'hostport' => '', // 数据库连接参数 'params' => [], // 数据库编码默认采用utf8 'charset' => 'utf8', // 数据库表前缀 'prefix' => '', // 数据库调试模式 'debug' => false, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) 'deploy' => 1, // 数据库读写是否分离 主从式有效 'rw_separate' => true, // 读写分离后 主服务器数量 'master_num' => 1, // 指定从服务器序号 'slave_no' => '', // 是否严格检查字段是否存在 'fields_strict' => true, // 数据集返回类型 'resultset_type' => 'array', // 自动写入时间戳字段 'auto_timestamp' => true, // 是否需要进行SQL性能分析 'sql_explain' => false, ], // +---------------------------------------------------------------------- // | 其他设置 // +---------------------------------------------------------------------- ];
thinkphp 5.1 配置应用模式就有点坑了,配置项还是 app_status,
config目录下的 app.php 配置文件修改:
// 应用模式状态 'app_status' => env('status'),
在项目根目录下放置 .env 文件,内容:
status=develop
config目录下增加几个环境配置 develop.php, pre.php, online.php 等
打开app_debug, app_trace 跟踪调试看到, 整个config目录下的所有配置文件都被加载进来了,
意思就是我加的各个环境配置都被自动加载了,那还怎么达到区分切换各环境不同配置的目的?
我就好奇为啥会这样情况,难道我配置有问题,于是我搜了整个thinkphp核心框架, 发现 app_status配置根本没用到,此项配置形同虚设。
thinkphp框架核心采用最新的版本: 5.1.38 LTS
应该是框架这个功能还没做好。
但我还是想要应用模式不同环境有各自的配置咋办(自动化部署就必须这样做,比如Jenkins,不需要每个环境部署上传完后还要单独修改配置) ?
既然上面说的所有配置文件都被加载进来,那么我们可以在环境配置文件里稍作修改,以 develop.php 为例,代码参考如下:
<?php // 自定义配置 $config = [ 'app' => [ // 异常处理handle类 留空使用 \think\exception\Handle 'exception_handle' => '\\app\\common\\exception\\ExceptionHandler', // 应用调试模式 'app_debug' => true, // 应用Trace 'app_trace' => true, ], // +---------------------------------------------------------------------- // | 数据库设置 // +---------------------------------------------------------------------- 'database' => [ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => '127.0.0.1', // 数据库名 'database' => 'workdata', // 用户名 'username' => 'root', // 密码 'password' => 'root', // 端口 'hostport' => '', // 连接dsn 'dsn' => '', // 数据库连接参数 'params' => [], // 数据库编码默认采用utf8 'charset' => 'utf8', // 数据库表前缀 'prefix' => '', // 数据库调试模式 'debug' => true, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) 'deploy' => 0, // 数据库读写是否分离 主从式有效 'rw_separate' => false, // 读写分离后 主服务器数量 'master_num' => 1, // 指定从服务器序号 'slave_no' => '', // 是否严格检查字段是否存在 'fields_strict' => true, // 数据集返回类型 'resultset_type' => 'array', // 自动写入时间戳字段 'auto_timestamp' => false, // 时间字段取出后的默认时间格式 'datetime_format' => 'Y-m-d H:i:s', // 是否需要进行SQL性能分析 'sql_explain' => false, // Query类 'query' => '\\think\\db\\Query', ] ]; // 解决thinkphp 5.1 (ver: 5.1.38 LTS)配置app_status无效的情况,临时解决办法: if(config('app.app_status') == 'develop') { foreach($config as $key=>$item) { if(is_array($item)) { foreach($item as $skey=>$sval) { config($key.'.'.$skey, $sval); } } else { config('app.'.$key, $item); } } } return $config;
ok, 搞定,收工。等 thinkphp 5.1 这个app_status功能完善起来再去掉上面的临时解决办法代码。
每个环境只需要单独配置 .env 文件即可:
开发环境:
status=develop
正式环境:
status=online
git代码提交只需要忽略提交这个 .env 文件, 就可以轻松自动化部署代码。