php - Laravel 阻止特定路由的数据库访问

标签 php session laravel laravel-4

我有一个路由 /status,负载均衡器使用该路由来确定我的实例是否已启动并正在运行。我需要由 laravel(而不是 apache)控制它,这样我就可以利用 artisan down/up 命令来手动控制实例运行状况。

我今天遇到了一个事件,我的数据库拒绝连接(一个不相关的问题)。不幸的是,这导致 /status 路由失败,因为它正在连接到数据库(用于 session )。我添加了一个过滤器来使用数组 session 驱动程序,希望它能够停止访问数据库,但由于某种原因它仍然在访问数据库。

这是我使用过滤器的路线。这一切都非常简单:

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 中的数据库密码更改为不正确的内容。我的希望是,因为路由根本没有访问数据库,所以它不应该关心密码是否不正确。错误的!路线失败。更糟糕的是,堆栈跟踪表明连接是由于 session 相关的代码路径而启动的。

Stack Trace

这对我来说真的很奇怪。我的第一个预感是,框架中存在一个与 session 相关的代码路径,该路径在 disablesessions 过滤器运行之前发生,从而导致连接发生。过滤器随后运行并影响响应(无 cookie)。我真的很感激这里的一些帮助:)

最佳答案

我可能是错的。可能有一种方法可以完全禁用路由的数据库访问,但从堆栈跟踪来看,似乎连接是在代码深处建立的,而我的谷歌搜索没有返回任何内容。

您还可以切换连接以使用 SQLite,您不需要服务器来运行 SQLite,因为它作为文件存储在文件系统上。因此,设置一个 SQL 配置并确保它可写,并将过滤器替换为:

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

另一种方法是使用重写规则并让 Apache/Nginx 处理该路由。只需完全绕过 Laravel 并将其指向您选择的脚本即可。这还有一个小优点,如果您的应用程序出现问题,状态脚本不会受到影响。

关于php - Laravel 阻止特定路由的数据库访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25631438/

相关文章:

php - 尝试获取YouTube视频标题和描述

ios - 我可以通过 Google Analytics 跟踪特定用户 ID 的 session 持续时间吗?

ajax - Laravel 使用 ajax 将数据传递给 Controller

mysql - Laravel 5.4 原始连接查询

php - 根据购物车页面中的属性值和产品数量在 WooCommerce 中添加到购物车验证

php - 使用 Jquery/Ajax 更新购物车

php - 使用 mPDF 将 HTML 表导出为 PDF

java - Hibernate的session线程安全吗?

php - session (CodeIgniter)

php - Laravel 迁移表字段的类型更改