【发布时间】:2017-05-19 05:11:57
【问题描述】:
应用程序一直按预期运行,直到我添加了以下用于显示图像的路由:
Route::get('/images/workers/{imageName}', function($imageName){
if(Auth::check()){
// Intervention using GD does not have functionality for bmp images
//return \Image::make(getenv('IMAGE_DIR') . $imageName)->response();
$filename = getenv('IMAGE_DIR') . $imageName;
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);
header("content-type: image/bmp");
echo $contents;
} else {
return \Image::make(getenv('IMAGE_DIR') . 'denied.png')->response();
}
});
在我的一个控制器中,我获取包含指向这些图像的链接的记录,并将它们显示在带有分页的表格中。我一次显示 50 条记录,使用 <img> 元素显示图像(记录的缩略图)。我通常可以按预期显示前几页,但随后我将开始显示我的denied.png 图像,一旦发生这种情况,我发现我已注销并且必须重新登录。
我阅读了Andrew's answer here 并得出结论,我发生了一种竞争情况,它以某种方式破坏了会话并导致帐户被注销。然后我在我的数据库中创建了一个sessions 表并将laravel 中的会话驱动程序更改为database,但是它看起来不像是使用会话驱动程序进行身份验证?那是对的吗?如果是这样并且这是一种竞争条件,我该如何规避它?
使用 laravel 5.2.45
编辑
还有一点值得注意,就是这个环境使用的是 nginx/phpfpm。是不是我的大部分请求都由一个工作线程处理,但偶尔它们正在由另一个处理,而这个线程不知道现有的身份验证会话?或者哪个工作线程通过 fpm 处理请求并且身份验证会话在它们之间持续存在并不重要?
【问题讨论】: