簡體   English   中英

同一台服務器上的兩個 Laravel 應用程序相互沖突

[英]Two Laravel applications on the same server conflicting with one another

我在同一台服務器上運行了 2 個 Laravel 應用程序。 服務器是 Apache 2.4,我設置了虛擬主機來為不同域上的每個應用程序提供服務。

第一個應用程序是一個 API,它的 .env 文件設置如下:

APP_ENV=production
APP_KEY=YYYYYYYYYYYYYYYYYY
APP_DEBUG=false
APP_LOG_LEVEL=debug
APP_URL=https://notify.mysite.com
APP_DOMAIN=notify.mysite.com


DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=notify
DB_USERNAME=YYYYYYYYYYYYYYYYYY
DB_PASSWORD=YYYYYYYYYYYYYYYYYY

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

第二個應用程序是一個 UI,它利用了第一個應用程序的 API。 它的 .env 文件是這樣設置的:

APP_ENV=local
APP_KEY=XXXXXXXXXXXXXX
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=https://asapps.mysite.com
APP_DOMAIN=asapps.mysite.com
APP_VERSION=1


DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=asapps
DB_NOTIFY_DATABASE=notify
DB_FLIGHT_DATABASE=flights
DB_USERNAME=XXXXXXXXXXXXXX
DB_PASSWORD=XXXXXXXXXXXXXX

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

我可以從 Swagger 編輯器、Postman 和其他服務器向我的 API 發送消息,一切都按預期工作。

我的第二個應用程序本身也按預期工作。

但是,如果我的第二個應用程序向 API 發送請求,則 API 應用程序會拋出此錯誤:

異常 'PDOException' 與消息 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'asapps.preprocessor_config' 在 C:\\notify\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Connection 中不存在.php:332

什么?

API 的數據庫設置為DB_DATABASE=notify ,當我從其他服務器發送消息時,它肯定會正確使用該連接。 那么為什么當我從該應用程序調用 API 時它會嘗試使用第二個應用程序的數據庫連接??? 它幾乎就像在緩存數據庫連接並試圖繼續使用相同的連接......我該如何阻止它?

表 'asapps.preprocessor_config' 不存在'

經過更多的挖掘(閱讀瘋狂的谷歌搜索),我在這里找到了問題和解決方案

最重要的一點是,當站點A接受請求時,php會在http請求的整個長度內加載它的.env變量。 在該請求期間,站點A調用站點B時,由於它們位於運行相同php的同一服務器上,因此php仍在使用站點A的.env,並且根本不會單獨加載站點B的.env文件。

作者的更好解釋:

創建帶有變量的.env文件,以便人們不會將其憑據推送到github存儲庫和其他可能共享源代碼的地方。

現在,作為環境變量,它們在http請求的整個持續時間內(在本例中為腳本執行)在整個系統范圍內。 關鍵是您的腳本運行時間很長。

要找到確定的解決方案,您可以采用以下三種方法之一。

....

“命名空間” ENV變量。

這更多的是評論,而不是答案,但是我沒有足夠的代表評論。 我遇到了類似的問題,也許可以提供幫助。

如果這兩個應用程序共享任何目錄,則默認情況下,laravel使用文件系統進行緩存。

如果要與兩個不同的數據庫連接共享代碼庫,請改用數據庫進行緩存。 您可以使用artisan命令php artisan cache:table發布遷移以創建php artisan cache:table

然后,只需運行php artisan migrate CACHE_DRIVER並將.env文件中的CACHE_DRIVER行更改為'database'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM