我有一个懒惰通过AJAX加载照片的页面。有时,随着照片的加载,所有会话数据都会丢失。每次加载页面时都不会发生这种情况。我觉得我已经排除了会话超时/垃圾收集的原因。我也觉得我正在从AJAX请求中正确地返回响应。会话ID不会更改,会话cookie也不会丢失。保存到会话中的所有数据都已消失。有没有人有任何想法?我使用的是Laravel 4.1.28和jQuery 1.8.0。
HTML片段:
<tbody>
<tr>
<td class="photo-col" id="pidm-123456-photo-col"><img class="thumbnail" height="108" src="/shared/assets/img/idcardphotos/loading.gif" width="108"></td>
</tr>
<tr>
<td class="photo-col" id="pidm-234567-photo-col"><img class="thumbnail" height="108" src="/shared/assets/img/idcardphotos/loading.gif" width="108"></td>
</tr>
JavaScript的:
$(document).ready(function() {
loadPhotos();
});
function loadPhoto(pidm) {
var img =
$('<img class="thumbnail" height="108" width="108">')
.attr('src', '/idcardphoto/' + pidm + '?thumbnail=true')
.load(function() {
$('#pidm-' + pidm + '-photo-col').html(img);
});
}
function loadPhotos() {
$('.photo-col').each(function() {
loadPhoto($(this).attr('id').split('-')[1]);
});
}
AJAX请求使用的路由:
$this->app['router']->get('idcardphoto/{pidm}', ['as' => 'core::id_card_photo', function($pidm)
{
$thumbnail = (bool) Input::get('thumbnail');
$photo = '/path/to/idcardphotos/' . ($thumbnail ? 'thumbnails/' : '') . $pidm . '.jpg';
if (file_exists($photo))
{
return Response::make(file_get_contents($photo))->header('Content-Type', 'image/jpg');
}
$photo = '/shared/assets/img/idcardphotos/notavailable.gif';
return Response::make(file_get_contents($photo))->header('Content-Type', 'image/gif');
}])
->where('pidm', '[0-9]+');
Laravel会话配置:
return [
'driver' => 'file',
'lifetime' => 30,
'expire_on_close' => true,
'files' => storage_path().'/sessions',
'connection' => null,
'table' => 'sessions',
'lottery' => array(2, 100),
'cookie' => 'recreg_session',
'path' => '/',
'domain' => null,
'secure' => false,
];
答案 0 :(得分:3)
经过进一步研究,我现在意识到这种行为是由于Laravel文件会话驱动程序不执行任何锁定。我创建了一个执行锁定的自定义文件会话驱动程序,问题就消失了。以下是一些帮助我的链接: