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