在Laravel中长时间轮询(sleep()函数使应用程序冻结)

我试图在Laravel中编程长轮询function,但是当我使用sleep()函数时,整个应用程序冻结/阻塞,直到sleep()函数完成。 有谁知道如何解决这个问题?

我的JavaScript看起来像这样:

function startRefresh() { longpending = $.ajax({ type: 'POST', url: '/getNewWords', data: { wordid: ""+$('.lastWordId').attr('class').split(' ')[1]+"" }, async: true, cache: false }).done(function(data) { $("#words").prepend(data); startRefresh(); }); } 

而PHP:

 public function longPolling() { $time = time(); $wordid = Input::get('wordid'); session_write_close(); //set_time_limit(0); while((time() - $time) < 15) { $words = Word::take(100)->where('id', '>', $wordid) ->orderBy('created_at', 'desc')->get(); if (!$words->isEmpty()) { $theView = View::make('words.index', ['words' => $words])->render(); if (is_object($words[0])) { $theView .= '<script> $(".lastWordId").removeClass($(".lastWordId").attr("class") .split(" ")[1]).addClass("'.$words[0]->id.'"); </script>'; } return $theView; } else { sleep(2); } } } 

我正在使用:PHP 5.5和Apache 2.2.22

这个问题似乎没有发生在Laravel之外(在Laravel的项目中)。

提前致谢。

其实这是不长的轮询,如果你使用骨码。 长时间轮询是指连接保持打开状态(可能有一个超时),直到服务器发送一个响应。 如果客户端每2秒发送一次请求并获得响应,则只是轮询,并且在最差的情况下迟到2秒钟。 通过长时间轮询,您不会有这个延迟。

冻结问题与Laravel没有任何关系。 会话块。 所以使用session_write_close(); 在调用长轮询方法或使用cookie会话驱动程序之前。 欲了解更多信息,请参阅http://konrness.com/php5/how-to-prevent-blocking-php-requests/

你应该在javascript中进行长时间的检查,并且每2秒检查一次

 var refreshIntervalId = setInterval(function () { // perform AJAX request every 2 seconds longpending = $.ajax({ type: 'POST', url: '/getNewWords', data: { wordid: ""+$('.lastWordId').attr('class').split(' ')[1]+"" }, async: true, cache: false }).done(function(data) { // process JSON response var obj = jQuery.parseJSON(data); $("#words").prepend(obj.output); if(obj.status) == 'complete' clearInterval(refreshIntervalId); startRefresh(); }); }, 2000); // end refreshInterval 

然后在你的PHP

 echo json_encode(array('status'=> 'incomplete', 'output'=>$theView)); 

没有测试过这个代码,但你应该明白了。