新版的webman,沒有了env
1.取消的原因是什么?
2.取消后,如何區(qū)分 不同環(huán)境 的配置?
https://github.com/vlucas/phpdotenv/issues/410
https://github.com/walkor/webman/issues/200
主要是有用戶發(fā)現(xiàn) phpdotenv 在多線程環(huán)境下有bug。
另外的原因是想讓webman內核更精簡,只提供必要的 http協(xié)議解析、路由、中間件、日志等功能。
其他如數(shù)據(jù)庫、redis、包括phpdotenv等等其他功能由開發(fā)者決定是否安裝,以及安裝哪個。這樣的好處是可以更好復用php現(xiàn)有composer生態(tài),也能避免webman內核因為功能過多版本更新時產(chǎn)生較大變動導致無法向下兼容。
雖然webman去掉了phpdotenv,但是你仍然可以通過 composer require vlucas/phpdotenv
安裝它,
安裝后使用getenv()
函數(shù)就可以獲取配置了。
區(qū)分環(huán)境有多種方案,比如配置文件不提交到版本庫,版本庫里只提供exapmle.xxx.php的樣本配置文件。新項目根據(jù)樣本配置。這樣的好處是更新時不會因為環(huán)境導致配置沖突或者配置推送到錯誤的環(huán)境。
我們就是想根據(jù)配置的環(huán)境,比如dev|test|prod,來判斷取得對應環(huán)境的配置參數(shù),就可以了。還是希望官方能指定一個大家公用比較多的配置組件,謝謝大佬了。
這是thinkphp的env的寫法,我改了下,可以用到webman里,而且$_ENV是二進制安全的,
<?php
namespace captain\webman;
class Env
{
/**
* 環(huán)境變量數(shù)據(jù)
* @var array
*/
protected static $data = [];
/**
* 讀取環(huán)境變量定義文件
* @access public
* @param string $file 環(huán)境變量定義文件
* @return void
*/
public static function load($file)
{
if(!is_file($file)){
return;
}
$env = parse_ini_file($file, true);
self::set($env);
}
/**
* 獲取環(huán)境變量值
* @access public
* @param string $name 環(huán)境變量名
* @param mixed $default 默認值
*/
public static function get($name=null, $default = null)
{
if($name==null){
return self::$data;
}
$name=strtoupper($name);
$name = strtoupper(str_replace('.', '_', $name));
if (isset(self::$data[$name])) {
return self::$data[$name];
}
return $default;
}
/**
* 設置環(huán)境變量值
* @access public
* @param string|array $env 環(huán)境變量
* @param mixed $value 值
* @return void
*/
public static function set($env, $value = null)
{
if (is_array($env)) {
$env = array_change_key_case($env, CASE_UPPER);
foreach ($env as $key => $val) {
if (is_array($val)) {
foreach ($val as $k => $v) {
self::$data[$key . '_' . strtoupper($k)] = $v;
}
} else {
self::$data[$key] = $val;
}
}
} else {
$name = strtoupper(str_replace('.', '_', $env));
self::$data[$name] = $value;
}
}
}
用法,支持數(shù)組標記(實際上會把 . 都轉換為_)
##############CORE##################
[app]
debug=1
#進程數(shù)量
count=1
server_addr=http://0.0.0.0:8080
session_drive=file
Env::get('app.count',cpu_count() * 2)