2015-09-30 45 views
3

我有兩個Laravel API在我的本地開發機器上提供AngularJS應用程序。當Angular頁面調用POST到兩個似乎使用錯誤的數據庫名稱的API(它使用另一個Laravel的實例數據庫)時,我遇到了一個奇怪的問題。 Laravel拋出一個異常,說Table database.table未找到,其中數據庫是不正確的數據庫。我已經嘗試使用Postman調用每個API,並且工作正常,並且我確定沒有提及任何項目中的其他數據庫。奇怪的Laravel 5緩存使用錯誤的數據庫名稱

對我來說,這似乎是一個緩存問題,由於某些原因,.env文件可能會在兩臺Laravel服務器之間緩存和共享。這兩個Laravel應用程序都在Apache上託管。我試過調用php artisan config:clear,並在.htaccess文件中設置了適當的頭文件來試圖阻止任何緩存,但這兩個文件都沒有工作。我也在多個瀏覽器上嘗試過,清除了緩存,但仍然出現相同的錯誤。

我希望能夠使用.env文件,以便我可以爲我的開發服務器配置唯一的配置,所以我寧願在config/database.php中對數據庫憑證進行硬編碼。任何想法可能是什麼問題?

兩個database.php中的文件看起來像:

'mysql' => [ 
'driver' => 'mysql', 
'host'  => env('DB_HOST'), 
'database' => env('DB_DATABASE'), 
'username' => env('DB_USERNAME'), 
'password' => env('DB_PASSWORD'), 
'charset' => 'utf8', 
'collation' => 'utf8_unicode_ci', 
'prefix' => '', 
'strict' => false, 
], 

這裏獨特的設置存儲在.env

+0

'.env'位於你項目的根目錄中,而不是'app /'目錄中。 – sebdesign

+0

對不起,這是一個錯字。 – Gabriel

+0

我還沒有解決這個問題,但作爲臨時解決方法,我現在只是在app/config/database.php中根據env('APP_ENV')的值定義數據庫憑證,而不是將它們存儲在.env文件中 – Gabriel

回答

1

我有相同的問題。一個網頁將請求5個來自laravel的不同數據集的json響應,並且大約一半的請求會以'不正確的數據庫'錯誤進行彈出,即使當您在自己的瀏覽器選項卡中重新加載確切的請求時,它們也能正常工作。看起來像一個Laravel bug,它與處理來自apache的同時web請求有關。

無論如何,我的解決方法是硬編碼我的config \ database.php文件中的所有連接的主機,數據庫,用戶名和密碼,現在我的JSON請求不再彈了。但是,它需要將密碼硬編碼到源代碼管理中,並處理多個環境 - 在存在.env文件之前,基本上會回到黑暗時代。

4

我遇到了同樣的問題,在我的情況下,它是由toddbchttps://github.com/vlucas/phpdotenv/issues/76上報告的問題引起的。

Laravel依賴於vlucas/phpdotenv,它使用PHP的putenv()來添加.env文件中的值,以便它們可以被您的應用程序訪問。但是,

putenv()getenv()不需要重入或線程安全。這意味着如果兩個線程同時調用它們(在不同的核心上,或者在函數中間的上下文切換中),就會發生不好的事情。

因此,兩個PHP實例(在我的案例中來自不同的應用程序)能夠在併發請求期間讀取屬於彼此的環境變量。

由於vlucas在他對問題報告的回覆中有幫助地解釋,這是預期的行爲,解決方案是在您的web服務器配置文件中定義您的環境變量。

什麼工作對我來說是刪除DB_HOSTDB_DATABASE,從我.env文件DB_USERNAMEDB_PASSWORD線及以下添加到我的Apache虛擬主機配置塊:

SetEnv DB_HOST db_host 
SetEnv DB_DATABASE db_name 
SetEnv DB_USERNAME db_user 
SetEnv DB_PASSWORD db_pass 

(不要忘了重新啓動Apache在更改配置後)

請注意,如果您的Web根目錄中有一個Laravel應用程序,並且在使用Apache Alias指令將子請求路由到正確應用程序的子目錄中安裝了額外的Laravel應用程序,則需要使用SetEnvIfBOTH套數據庫憑據的,就像這樣:

# Laravel app 1 in web root 
SetEnvIf Host ".*" DB_HOST=db1_host 
SetEnvIf Host ".*" DB_DATABASE=db1_name 
SetEnvIf Host ".*" DB_USERNAME=db1_user 
SetEnvIf Host ".*" DB_PASSWORD=db1_pass 

# Laravel app 2 in subdirectory "/subdir" 
SetEnvIf Request_URI ^/subdir DB_HOST=db2_host 
SetEnvIf Request_URI ^/subdir DB_DATABASE=db2_name 
SetEnvIf Request_URI ^/subdir DB_USERNAME=db2_user 
SetEnvIf Request_URI ^/subdir DB_PASSWORD=db2_pass 

(有關爲何不能使用的SetEnvSetEnvIf組合的解釋,見https://staff.washington.edu/fmf/2013/04/24/using-setenv-and-setenvif-together-in-apache/

關於這個的好處解決方案(如果它適用於您)僅僅需要在出現問題的環境中實施,即它隻影響本地開發環境,則無需在生產服務器上更改任何內容。

3

什麼工作對我來說是通過運行這些命令來清除一堆的Laravel設置:

php artisan config:clear 
php artisan cache:clear 
php artisan route:clear 
php artisan view:clear 
php artisan optimize 

我不知道該命令做了,但現在Laravel識別/正確讀取.ENV文件爲我的數據庫配置。

+0

謝謝 - 嘗試第一個(配置:清除),它的工作。我相信其餘的可能是不必要的。 –

+0

我有一個die()在我的config/database.php中,它沒有被調用 - 執行'php artisan config:clear'之後它被調用(簡而言之,這對我有用) –

1

老問題,但以防萬一其他人認爲這是發生在他們身上(如剛剛發生在我身上),我簡單的解決辦法是改變的項目之一的.ENV變量的名稱:

DB_X_HOST="localhost" 
DB_X_DATABASE="other_project" 
DB_X_USERNAME="homestead" 
DB_X_PASSWORD="secret" 
DB_X_PORT="3306" 

您然後更改設置\ database.php中的變量爲:

'mysql' => [ 
     'driver' => 'mysql', 
     'host' => env('DB_X_HOST', '127.0.0.1'), 
     'port' => env('DB_X_PORT', '3306'), 
     'database' => env('DB_X_DATABASE', 'forge'), 
     'username' => env('DB_X_USERNAME', 'forge'), 
     'password' => env('DB_X_PASSWORD', ''), 
     'charset' => 'utf8mb4', 
     'collation' => 'utf8mb4_unicode_ci', 
     'prefix' => '', 
     'strict' => true, 
     'engine' => null, 
    ] 

現在,你不應該有在馬克的響應

1

一輯詳細介紹了交叉污染與php artisan serve重新啓動已修復相同的問題對我來說