Длительный опрос в функции Laravel (sleep () делает замораживание приложения)

Я пытаюсь программировать длинные функции опроса в Laravel, но когда я использую функцию 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).

Заранее спасибо.

На самом деле это длинный опрос, если вы используете код bonez. Длительный опрос – это если соединение остается открытым (возможно, с таймаутом), пока сервер не отправит ответ. Если клиент отправляет каждые 2 секунды запрос и получает ответ, это просто опрос, и вы получаете ответ сервера на 2 секунды позже в худшем случае. При длительном опросе у вас нет этой задержки.

Проблема с замораживанием не является ошибкой с Laravel. Секции сеанса. Поэтому используйте session_write_close (); перед вызовом метода длинных опросов или использованием драйвера сеанса cookie. Для получения дополнительной информации см. http://konrness.com/php5/how-to-prevent-blocking-php-requests/

Вы должны сделать longpolling в 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)); 

Не проверял этот код, но вы должны получить эту идею.