【发布时间】:2014-10-27 04:39:02
【问题描述】:
我的负载均衡器使用路由/status 来确定我的实例是否启动并运行。我需要由 laravel(而不是 apache)控制它,这样我就可以利用 artisan down/up 命令手动控制实例运行状况。
我今天发生了一个事件,我的数据库拒绝连接(一个不相关的问题)。不幸的是,这导致/status 路由失败,因为它正在连接到数据库(用于会话)。我添加了一个过滤器来使用数组会话驱动程序,希望它会停止访问数据库,但由于某种原因它仍在访问数据库。
这是我使用过滤器的路线。一切都很简单:
Route::filter('disablesessions', function() {
Config::set('session.driver', 'array');
});
Route::get('/status', ['before' => 'disablesessions', function() {
return 'ok';
}]);
当我curl -v http://localhost/status 时,我得到以下响应(没有 cookie,耶!):
< 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 我们将数据库用于 99% 的其他路线,而 Laravel 是一个不错的选择。我们需要这条特定的路线是独立于数据库的,这样数据库问题就不会破坏我们的 php 服务器。
标签: php session laravel laravel-4