2014-09-02 40 views
2

我有一個路由/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改變了我的數據庫密碼不正確的數據。我的希望是,因爲路由根本沒有打到數據庫,它不應該在意密碼是不正確的。錯誤!路線失敗。更糟糕的是,堆棧跟蹤表明由於與會話相關的代碼路徑而啓動了連接。

Stack Trace

這似乎真的奇怪的我。我的第一個預感是框架中有一個會話相關的代碼路徑,在disablesessions過濾器運行之前發生,這會導致連接發生。過濾器隨後運行並影響響應(無cookie)。我真的很感謝這裏的一些幫助:)

+0

我不知道你是否可以完全刪除數據庫交互。老實說,如果你沒有從這個實例提供應用程序,那麼像Laravel這樣的全棧框架可能是錯誤的工具。 – rich97 2014-09-03 08:50:24

+0

@ rich97我們將其數據庫用於99%的其他路線,Laravel是其中的絕佳選擇。我們需要這一個特定的路線來獨立於數據庫,以便數據庫問題不會中斷我們的php服務器。 – advait 2014-09-04 03:15:50

回答

1

我可能是錯的。可能有一種方法可以完全禁用某個路由的數據庫訪問,但查看堆棧跟蹤看起來好像連接已深深地建立在代碼中,並且我的Google搜索沒有任何返回。

您也可以將連接切換爲使用SQLite,您不需要服務器來運行SQLite,因爲它存儲爲文件系統上的文件。因此,建立一個SQL配置,並確保它的可寫,並更換您的過濾器:

Config::set('database.default', 'sqlite'); 

另一種方法是使用一個重寫規則,讓阿帕奇/ Nginx的處理這條路線。完全繞開Laravel並將其指向您選擇的腳本。這也有一個小優點,即如果應用程序出現問題,則狀態腳本不受影響。

+0

謝謝@ rich97!我現在傾向於純粹的Apache。欣賞它。 – advait 2014-09-04 17:51:22

+0

很高興我能幫到你。你會介意標記爲答案,以便我可以得到那些甜美可愛的虛擬互聯網點嗎? – rich97 2014-09-05 08:09:58