- 通过parse_ini_file 函数来获取.env 文件的配置参数。
[#DB Config] // 加上中括号表示 【章节名】后面不能直接接 = 会报错 [DB_USER]root=ooo // 如果parse_ini_file 第二参数为false,则章节名会被忽略,为true则会作为数组键名返回(即返回多维数组)。设置【章节】 便于管理配置参数,比如mysql,redis。。。 DB_PASS=root // 配置参数必须有“=”连接,没有=的会被忽略,#和//在这里都没有注释作用,即便写了也没用,会被作为数组键名。
DB_USER // 比如这个没加 = 是获取不到这个值的
[aa] //另一个好处:当parse_ini_file 第二个参数为true 的时候,并且配置了【章节名】那么重复定义的常量都会获取到(这里的ab),如果没有同时设置true 和 章节名, 那么重复的会被覆盖掉,取最后一个值(就是数组相同键名覆盖)
ab=a
[bb]
ab=b
不加中括号而且没有接=的,都会被忽略,所以可以以这种方法加“注释”。
mysql // 就相当于注释的作用了,而且parse_ini_file 第二个参数设置为 true 也不会读取到mysql
DB_USER=root - 读取env文件全局函数(yii框架放在入口文件或者其他能全局的地方。或者配置成助手类的形式):
1 if (!function_exists('env')) { 2 function env($name, $file='.env') 3 { 4 $path = Yii::$app->basePath; 5 $filePath = rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $file; 6 $configs = parse_ini_file($filePath, true); 7 if (empty($configs)) { 8 die('err: file is empty'); 9 } 10 // 判断 是否加了注释 # 并且判断是否设置【章节】即是否是二维数组 11 foreach ($configs as $key => $val) { 12 if (is_array($val)) { 13 foreach ($val as $k => $v) { 14 if (substr($k, 0, 1) == '#' || substr($key, 0, 2) == '//') { 15 unset($configs[$key][$k]); 16 } 17 // 如果传了$name 字段,那么根据name获取指定的字段值 18 if ($k == $name && !empty($name)) { 19 return isset($configs[$key][$k]) ? $configs[$key][$k] : null; 20 } 21 } 22 } else { 23 if (substr($key, 0, 1) == '#' || substr($key, 0, 2) == '//') { 24 unset($configs[$key]); 25 } 26 // 如果传了$name 字段,那么根据name获取指定的字段值 27 if ($key == $name && !empty($name)) { 28 return isset($configs[$key]) ? $configs[$key] : null; 29 } 30 } 31 } 32 return ($configs) ; 33 } 34 }
放在yii 入口文件里 必须放在config 前面,例如
if (!function_exists('env')) { function env($name, $file='.env') { $path = __DIR__ . '/../'; //在这里还用不了Yii::$app->basePath ,因为还没注册 $filePath = rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $file; $configs = parse_ini_file($filePath, true); if (empty($configs)) { die('err: file is empty'); } // 判断 是否加了注释 # 并且判断是否设置【章节】即是否是二维数组 foreach ($configs as $key => $val) { if (is_array($val)) { foreach ($val as $k => $v) { if (substr($k, 0, 1) == '#' || substr($key, 0, 2) == '//') { unset($configs[$key][$k]); } // 如果传了$name 字段,那么根据name获取指定的字段值 if ($k == $name && !empty($name)) { return isset($configs[$key][$k]) ? $configs[$key][$k] : null; } } } else { if (substr($key, 0, 1) == '#' || substr($key, 0, 2) == '//') { unset($configs[$key]); } // 如果传了$name 字段,那么根据name获取指定的字段值 if ($key == $name && !empty($name)) { return isset($configs[$key]) ? $configs[$key] : null; } } } return ($configs) ; } } // 必须放在这句之前才有效 $config = require __DIR__ . '/../config/web.php';