跳至正文

Laravel Config 缓存原理

参考

加载过程

  • laravel的所有配置文件都在config目录下
  • 启动时加载所有config目录下的所有配置文件
  • 通过Dotenv 类库加载.env文件中的配置项到预定义全局变量$_ENV中
  • env函数中使用getenv()来获取环境变量$_ENV中的值
  • config文件中使用env()加载配置值
  • config()函数调用config文件中的配置项

使用配置文件时要注意严格遵守约定,在config文件中调用env()函数

在路由,控制器和模型以及自定义类文件中必须使用config()函数获取配置项的值

Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables;
 /**
     * Bootstrap the given application.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return void
     */
    public function bootstrap(Application $app)
    {
        //此处判断是否开启缓存配置,开启缓存配置直接返回缓存中的配置
        //因此开启缓存配置后,env()函数会失效
        if ($app->configurationIsCached()) {
            return;
        }

        $this->checkForSpecificEnvironmentFile($app);
        //此处加载.env中的文件
        try {
            (new Dotenv($app->environmentPath(), $app->environmentFile()))->load();
        } catch (InvalidPathException $e) {
            //
        }
    }
/**
     * Gets the value of an environment variable.
     *
     * @param  string  $key
     * @param  mixed   $default
     * @return mixed
     */
    function env($key, $default = null)
    {
        $value = getenv($key);

        if ($value === false) {
            return value($default);
        }

        switch (strtolower($value)) {
            case 'true':
            case '(true)':
                return true;
            case 'false':
            case '(false)':
                return false;
            case 'empty':
            case '(empty)':
                return '';
            case 'null':
            case '(null)':
                return;
        }

        if (strlen($value) > 1 && Str::startsWith($value, '"') && Str::endsWith($value, '"')) {
            return substr($value, 1, -1);
        }

        return $value;
    }
/**
     * Get / set the specified configuration value.
     *
     * If an array is passed as the key, we will assume you want to set an array of values.
     *
     * @param  array|string  $key
     * @param  mixed  $default
     * @return mixed|\Illuminate\Config\Repository
     */
    function config($key = null, $default = null)
    {
        if (is_null($key)) {
            return app('config');
        }

        if (is_array($key)) {
            return app('config')->set($key);
        }

        return app('config')->get($key, $default);
    }
//app('config) 生成的是 Illuminate\Config\Repository 实例

开启缓存配置

php artisan config:cache

/**
     * Execute the console command.
     *
     * @return void
     */
    public function handle()
    {  
        //调用清楚缓存命令
        $this->call('config:clear');
       //加载所有配置项
        $config = $this->getFreshConfiguration();
       //使用var_export导出php可以执行的数组
       //文件系统使用file_put_contents 生成 配文件 config.php
       //配置文件缓存目录 app/bootstrap/cache/config.php
        $this->files->put(
            $this->laravel->getCachedConfigPath(),
            '<?php return ' . var_export($config, true) . ';' . PHP_EOL
        );

        $this->info('Configuration cached successfully!');
    }

php artisan config:clear

/**
     * Execute the console command.
     *
     * @return void
     */
    public function handle()
    {   
        //laravel文件系统使用 unlink 删除 缓存的config.php文件
        $this->files->delete($this->laravel->getCachedConfigPath());

        $this->info('Configuration cache cleared!');
    }

总结

处理思想就是把多个配置文件合并成一个配置文件,减少I/0操作提升性能.