Laravel:长轮询时更新会话

时间:2014-05-23 05:14:26

标签: php ajax session laravel long-polling

我的框架是PHP Laravel 4.我使用长轮询技术刷新HTML页面上的列表。在同一页面中,我有一个自动提交下拉列表。当用户选择一个选项时,它只是自动提交以重置会话值。重置后会话页面将刷新。但这里有一个错误。我什么时候开始轮询会话没有正确更新。有时它会更新,但大部分时间都会更新。

这就是我在AJAX长轮询PHP服务器端功能中尝试做的事情

public function getNewAppt() {

    //Session is open now. Connection to the server is opened. Session file is locked
    //Close the session
    if (session_status() != PHP_SESSION_NONE) {
        session_write_close();//close
    }

    $today_appt_count = 0;
    $result = Appointment::with(array('user' => function($query) {
                    $query->where('branch_id', Session::get('branch_id'));
                }))->where('start', 'LIKE', date('Y-m-d') . ' %')->get();

    foreach ($result as $appt) {
        if ($appt->user != null) {
            $today_appt_count++;
        }
    }
    return $today_appt_count;
}

当用户更改下拉列表时,首先我会停止长轮询功能,

console.log('Long Polling has Stopped');
ajaxLongPoll.abort();//Stop the long polling function

然后我自动将html表单提交给这个php函数。

public function postChangeBranch() {

    //Session is closed now, so start the session
    if (session_status() == PHP_SESSION_NONE) {
        session_start(); //start session again
    }

    Session::forget('branch_id');
    Session::put('branch_id', Input::get('branch_id'));
    return Redirect::to('calendar');
}

这是长轮询ajax函数

var poll = function() {
    ajaxLongPoll = $.ajax({
        type: 'GET',
        url: 'calendar/new-appt',
        dataType: 'html',
        success: function(data) {
            //update stuff
            requestCount++;
            console.log(requestCount);//number of times this function runs...
            console.log(data);//this will just print a live count from DB
        },
        error: function(data) {
            console.log(data);
        },
        complete: function() {
            poll();// recall this function after 30 sec
        },
        async: true, /* If set to non-async, browser shows page as "Loading.."*/
        cache: false,
        timeout: 30000 /* Timeout in ms */
    });
}//polling end
你可以告诉我这里我做错了什么吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

有些人建议在使用ajaxRequest.abort()提交表单之前关闭ajax请求; 检查下面。 Abort Ajax requests using jQuery 但它对我没用。

这就是我所做的,

我创建了一个名为 startPoll 的新变量,并修改了我的轮询ajax函数的完整部分,如下所示

    ....
    complete: function() {
        if(startPoll)//run only if this is true
        poll();// recall this function after 30 sec
    },
    .....

然后在我自动提交之前(在刷新页面之前),我会将 startPoll 值设置为false,以便停止我的轮询功能。< / p>

   //Long polling stop - On change the branch refresh the page
   $('select[name="branch_id"]').on('change', function(e) {
       e.preventDefault();
       console.log('Long Polling has Stopped');
       startPoll = false;
       $('#auto-sub').submit();
   });

最后这对我有用。希望这会对某人有所帮助。 :)