我有一個路由/status
,我的負載均衡器使用它來確定我的實例是否已啓動並正在運行。我需要這個由laravel控制(而不是apache),所以我可以利用artisan down/up
命令手動控制實例健康狀況。Laravel阻止特定路由的數據庫訪問
今天我發生了一個事件,我的數據庫拒絕連接(一個無關的問題)。不幸的是,這導致/status
路由失敗,因爲它連接到數據庫(對於會話)。我已經添加了一個過濾器來使用數組會話驅動程序,希望它會停止訪問數據庫,但由於某些原因,它仍然會觸及數據庫。
這是我的路線與過濾器。這一切都非常簡單:
Route::filter('disablesessions', function() {
Config::set('session.driver', 'array');
});
Route::get('/status', ['before' => 'disablesessions', function() {
return 'ok';
}]);
當我我curl -v http://localhost/status
獲得以下響應(無餅乾,耶!):
< HTTP/1.1 200 OK
< Date: Tue, 02 Sep 2014 19:48:45 GMT
* Server Apache/2.4.7 (Ubuntu) is not blacklisted
< Server: Apache/2.4.7 (Ubuntu)
< X-Powered-By: PHP/5.5.9-1ubuntu4.3
< Cache-Control: no-cache
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
< Content-Type: text/html; charset=UTF-8
作爲一個測試,我在config/database.php
改變了我的數據庫密碼不正確的數據。我的希望是,因爲路由根本沒有打到數據庫,它不應該在意密碼是不正確的。錯誤!路線失敗。更糟糕的是,堆棧跟蹤表明由於與會話相關的代碼路徑而啓動了連接。
這似乎真的奇怪的我。我的第一個預感是框架中有一個會話相關的代碼路徑,在disablesessions
過濾器運行之前發生,這會導致連接發生。過濾器隨後運行並影響響應(無cookie)。我真的很感謝這裏的一些幫助:)
我不知道你是否可以完全刪除數據庫交互。老實說,如果你沒有從這個實例提供應用程序,那麼像Laravel這樣的全棧框架可能是錯誤的工具。 – rich97 2014-09-03 08:50:24
@ rich97我們將其數據庫用於99%的其他路線,Laravel是其中的絕佳選擇。我們需要這一個特定的路線來獨立於數據庫,以便數據庫問題不會中斷我們的php服務器。 – advait 2014-09-04 03:15:50