讓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 文件, 就可以輕松自動化部署代碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM