ThinkPHP框架的.env读取原理

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,
    ]
];

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值