[Laravel 8.x] 多個網站在同一個伺服器,可能導致 env 衝突

因為最近要寫公司技術分享的文件,所以我在電腦上架了兩個網站要來測試實做 Passport 的功能。

我在操作將授權碼轉換成 Access Token 時出現找不到資料表的錯誤,而且我確定我的設定檔是對的。

經查詢才知道是因為我把網站架在同一個伺服器所導致,他們的 .env 環境變數衝突。

Laravel 使用了 vlucas/phpdotenv 套件,他會先去 .env 撈資料然後用 putenv 的方式設定到 php 環境裡,Laravel 需要時再透過 getenv 讀取。
所以問題就發生了,因為 putenv 和 getenv 是非執行序安全 (None Thread Safe, NTS),當有兩個程序同時執行,就有可能會發生環境變數互蓋的情況而導致錯誤,這通常發生在 Apache 上。

解法:
執行 php artisan config:cache,這樣程式執行的時候會先讀取快取檔案,就不會衝突啦。

留言