Laravel 4会话数据丢失了多个AJAX请求

时间:2014-05-21 21:26:28

标签: php jquery ajax session laravel-4

我有一个懒惰通过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,
];

1 个答案:

答案 0 :(得分:3)

经过进一步研究,我现在意识到这种行为是由于Laravel文件会话驱动程序不执行任何锁定。我创建了一个执行锁定的自定义文件会话驱动程序,问题就消失了。以下是一些帮助我的链接: