ThinkPHP框架的.env读取原理?
<?php
class Env
{
static $initialize;
/**
* 获取环境变量值
* @access public
* @param string $name 环境变量名(支持二级 . 号分割)
* @param string $default 默认值
* @return mixed
*/
public static function get($name, $default = null)
{
// 初始化一次
if(!self::$initialize){
self::init();
self::$initialize = true;
}
$result = getenv(ENV_PREFIX . strtoupper(str_replace('.', '_', $name)));
if (false !== $result) {
if ('false' === $result) {
$result = false;
} elseif ('true' === $result) {
$result = true;
}
return $result;
}
return $default;
}
/**
* 初始化设置环境变量值(只需要执行一次,所以建议放入口文件执行)
* @access public
* @return mixed
*/
private static function init()
{
defined('ENV_PREFIX') or define('ENV_PREFIX', 'PHP_'); // 环境变量的配置前缀
$envPath = dirname(dirname(dirname(__DIR__))).'/';
if (is_file($envPath . '.env')) {
$env = parse_ini_file($envPath . '.env', true);
foreach ($env as $key => $val) {
$name = ENV_PREFIX . strtoupper($key);
if (is_array($val)) {
foreach ($val as $k => $v) {
$item = $name . '_' . strtoupper($k);
putenv("$item=$v");
}
} else {
putenv("$name=$val");
}
}
}
}
}
最佳实践:
配置文件中调用此类来获取设置,不建议在业务代码中直接调用?
.env 文件
[app]
debug = true
[database]
type = mysql
hostname = 127.0.0.1
username = root
password = 123456
port = 3306
database = taobao
配置文件调用:
return [
// 数据库类型
'type' => Env::get('database.type','mysql'),
// 服务器地址
'hostname' => Env::get('database.hostname','127.0.0.1'),
// 数据库名
'database' => Env::get('database.database','taobao'),
// 用户名
'username' => Env::get('database.username','root'),
// 密码
'password' => Env::get('database.password',''),
// 端口
'hostport' => Env::get('database.port','3306'),
// 连接dsn
'dsn' => '',
// 数据库连接参数
'params' => [
'MYSQL_ATTR_USE_BUFFERED_QUERY' => true,
]
];
|