ThinkPHP框架的.env读取原理
<?phpclass Env{static $initialize;/** * 获取环境变量值 * @access public * @paramstring $name环境变量名(支持二级 . 号分割) * @paramstring $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 = mysqlhostname = 127.0.0.1username =rootpassword = 123456port = 3306database = 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,]];