Laravel技巧篇,將與主線「Laravel 學習筆記」不同的時間線,將不會「保姆式」的教學,只是分享平時我們開發時遇上的問題/發現好用的Laravel技巧

Laravel 執行了php artisan config:cache 就無法讀取env部分內容?!

發現問題

Laravel 本身就有使用 env 文件,但在系統上線後我們為了提升速度,我們一般會執行下面這句,把config cache起來

php artisan config:cache

這樣一來,你在env中的數據庫連線MAIL_MAILER等等的設定仍然是有效的

但如果你是自己手動新增了一些數值呢?

比如我在env有下面這一行,設定了

COMMENT_ON_PAGE = 15

如果我們再去嘗試讀取:

echo env('COMMENT_ON_PAGE');

原本會顯示15,但因為執行了 php artisan config:cache,就無法顯示了

解決方案

1. 檢查&了解原理

你去檢查一下config/app.php 中的aliases是否已有下面這一行

    'aliases' => [
        ...
        'Config' => Illuminate\Support\Facades\Config::class,
        ...
        ]

官方已做了個Config的Facades給我們使用

2. 建立一個 [常用變量] 文件

config目錄中建議,比如名為 config/setting.php

<?php
return [
    'COMMENT_ON_PAGE' => env('COMMENT_ON_PAGE'),
    'ADMIN_NAME' => 'Peter',
];

完成設定後執行一次

php artisan config:clear
php artisan config:cache
3. 如何使用

因為命名了文件名為setting,所以用以下方法

echo Config('setting.COMMENT_ON_PAGE');
echo Config('setting.ADMIN_NAME');

你分別會看到 env 中的 COMMENT_ON_PAGE 數值,以及你直接在setting.php中所填寫的ADMIN_NAME Peter

4.注意事項
  1. 雖然上面的例子,Peter成功顯示了出來,建議仍然使用env來做主力的配置文件常用變量文件,因為大部分人都是在env做網站配置,只不過是在config cache後會有少少問題,所以才這樣來解決

  2. 建議把所有env中,你自行新增的變量全部都新增一份去

  3. 如果你已用了php artisan config:cache,每次修改config文件env文件你都需要執行一次 clear 再執行一次 cache

  4. 這個其實不算是技巧,反而應該說是用來解決官方的小漏洞?編寫此文章時已經是Laravel9,但仍然會有此問題

後話一:開發段階或測試階段不要開config:cache

除非你真的是在針對cache做測試,而我是為了把速度提高而進行的測試,所以給我在網站推出前,先發現到問題!

但在線上的版本強烈建議一定要打開,因為頁一個需要900ms 的頁面一下子加速至只需要400ms,速度提升接近1倍有多

後話二:optimize 一口氣做所有加速

php artisan optimize

執行後你會看到

Configuration cache cleared!
Configuration cached successfully!
Route cache cleared!
Routes cached successfully!
Files cached successfully!

ref1: https://github.com/laravel/framework/issues/33613#issuecomment-662087677
ref2: https://www.digitalocean.com/community/tutorials/how-to-use-laravel-config-files