2014-09-02 75 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