2013-07-25 2 views
7

Я пытаюсь запрограммировать длинные функции опроса в Laravel, но когда я использую функцию sleep(), все приложение зависает/блокирует до функции sleep() готово. кто-нибудь знает, как решить эту проблему?Длинный опрос в Laravel (функция 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).

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

ответ

-6

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

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

+5

Это длинный опрос. Его справедливый опрос. –

+0

Причина, по которой я делаю это, заключается в том, что с apache/php вы часто будете запускать таймауты подключения, оставив соединение открытым. В частности, если вы находитесь за балансиром нагрузки Amazon, время соединения истекает через 30 секунд. ИМО лучше опросить каждые пару секунд. – bonez

+0

Опрос легко. Длительный опрос в PHP по-прежнему затруднен. – doncadavona

5

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

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

+0

Работает ли 'session_write_close()' в Laravel ?? Он уже звонит. – daVe