让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 文件, 就可以轻松自动化部署代码。

 

posted @ 2019-08-21 10:11  php学习笔记  阅读(1882)  评论(0编辑  收藏  举报