[Laravel] Laravel config cache và file .env

Spread the love

Hôm rồi làm dự án thực tế mới đụng đến cái này. Bây giờ chúng ta cùng tìm hiểu cơ chế laravel cache như thế nào

  1. Cách thức laravel load file config
  2. Cache config và không cache config khác nhau chỗ nào
  3. Cache config thực hiện những gì ?
  4. Tôi muốn những gì
  5. Vài câu lệnh giúp debug hiệu quả

I . Cách thức laravel load file config

Laravel sử dụng component PHPDotenv của Lucas để load file .env vào , mọi người có thể tham khảo về component đó ở đây

Xử lý load file env vào config của laravel được gọi theo flow như bên dưới, ở đây mình sẽ mô tả sơ việc  boostraping của laravel như bên dướ.

Boostrap là gì : đại khái trước khi server nhận request từ phía client, xử lý và trả về response, thì bootstrap sẽ load tất cả những thứ cần phải load trước vào trong Application , để khi dùng khi xử lý request từ phía client.

Thứ cần phải load trước :  Đây là những thứ cần để laravel application có thể xử lý được một request, đó có thể là DB Connection, thông tin settings email, Application encryption key, cũng như những services, facades … Và chúng ta có thể confirm list thứ cần phải load trước này ở : 

\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php (HTTP App)

\vendor\laravel\framework\src\Illuminate\Foundation\Console\Kernel.php (Console app , vd khi chạy câu lệnh php artisan tinker thì bạn đã tương tác với Laravel Application thông qua console

List những thứ cần phải load trước sẽ được khai báo ở bên dưới


/**
* The bootstrap classes for the application.
*
* @var array
*/
protected $bootstrappers = [
'Illuminate\Foundation\Bootstrap\DetectEnvironment',
'Illuminate\Foundation\Bootstrap\LoadConfiguration',
'Illuminate\Foundation\Bootstrap\ConfigureLogging',
'Illuminate\Foundation\Bootstrap\HandleExceptions',
'Illuminate\Foundation\Bootstrap\RegisterFacades',
'Illuminate\Foundation\Bootstrap\SetRequestForConsole',
'Illuminate\Foundation\Bootstrap\RegisterProviders',
'Illuminate\Foundation\Bootstrap\BootProviders',
];

Ok. Thế nhìn vào code, chúng ta, thấy Environment đang được load ở trong class DetectEnvironment

II . Cache config và không cache config khác nhau chỗ nào ? 

Đối tượng tìm hiểu tiếp theo của chúng ta sẽ là class DetectEnvironment , class này nằm tại đường dẫn bên dưới

\vendor\laravel\framework\src\Illuminate\Foundation\Bootstrap\DetectEnvironment.php . Bên trong class ta thấy có một hàm bootstrap , với nội dung

 /**
    /**
     * Bootstrap the given application.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return void
     */
    public function bootstrap(Application $app)
    {
        if (! $app->configurationIsCached()) {
            $this->checkForSpecificEnvironmentFile($app);

            try {
                (new Dotenv($app->environmentPath(), $app->environmentFile()))->load();
            } catch (InvalidPathException $e) {
                //
            }
        }
    }

Theo hình trên , thì hàm này, có nhiệm vụ boostrap nội dung file Dotenv, và lưu vào trong Application, à mà gượm đã còn một check nằm bên ngoài

$app->configurationIsCached() : đây có phải là chỉ thị chỉ get config từ file .env khi và chỉ khi chúng ta không áp dụng cache configuration trong laravel app ? , chúng ta đi tiếp sang cách Laravel caching config.

III. Cache config thực hiện những gì ?

Để trả lời câu hỏi trên, chúng ta tìm đến file source mà php artisan config:cache gọi , nằm ở

\vendor\laravel\framework\src\Illuminate\Foundation\Console\ConfigCacheCommand.php

khi gọi php artisan config:cache thì hàm bên dưới sẽ được thực hiện

    /**
     * Execute the console command.
     *
     * @return void
     */
    public function fire()
    {
        $this->call('config:clear');

        $config = $this->getFreshConfiguration();

        $this->files->put(
            $this->laravel->getCachedConfigPath(), '<?php return '.var_export($config, true).';'.PHP_EOL ); $this->info('Configuration cached successfully!');
    }

Khi thực hiện câu lệnh trên, thì các action bên dưới sẽ được thực hiện

  • Clear config cache (nếu có ) ( bootstrap/cache/config.php)
  • Get toàn bộ các config hiện tại
  • Save kết quả vào thư mục cache ( bootstrap/cache/config.php)

(Các  bạn có thể tự thực hiện , và khi check file bootstrap/cache/config.php , ta không thấy các giá trị của .env xuất hiện )

IV. Tôi muốn những gì trong .env cũng được cache ?

Ok. Bây giờ có một số thiết lập nằm trong file .env mà bạn muốn cache, ta sẽ làm như bên dưới

  1. Thêm config trongconfig\app.php
  2. Chạy câu lệnh php artisan config:cache
  3. Để truy xuất đến key DB_HOST ta có thể sử dụng đoạn code như `config(“app”)[“DB_HOST”]` để get thông tin DB_HOST

V. Vài câu lệnh giúp debug hiệu quả 

Chỉ cần bật terminal tại thư mục dự án , chúng ta có thể tương tác với Application thông qua câu lệnh tinker, đồng thời check xem là có thể gọi được env(KEY) hay là không

  1. Kiểm tra xem configuration có bị cache hay không
    >>> app()->configurationIsCached()
    => true
  2. Kiểm tra xem có access được file .env không
    >>> env('DB_HOST')
    => "52.196.xx.xx"

 

Tóm lược lại là, chúng ta không nên dùng env("KEY") với các file nằm ngoài thư mục config 😀

 

Reference :

https://serversforhackers.com/scaling-laravel (inspired by )

https://scotch.io/tutorials/how-to-use-laravel-config-files (for images )

4 thoughts on “[Laravel] Laravel config cache và file .env”

Leave a Reply

Your email address will not be published. Required fields are marked *