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