我有一个路由/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