2013-07-25 15 views
7

Sto provando a programmare la funzionalità di polling lungo in Laravel, ma quando uso la funzione sleep(), l'intera applicazione si blocca/blocca fino alla funzione sleep() è fatta. Qualcuno sa come risolvere questo problema?Polling lungo in Laravel (la funzione sleep() blocca l'applicazione)

mio javascript si presenta così:

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(); 
}); 

} 

E il 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); 
     } 
    } 
} 

sto usando: PHP 5.5 e Apache 2.2.22

Il problema non lo fa sembra accadere fuori da Laravel (in nessun progetto Laravel).

Grazie in anticipo.

risposta

-6

Si dovrebbe fare il longpolling in javascript e controllare ogni 2 secondi

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 

Poi, nel tuo PHP

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

Non hanno testato questo codice, ma si dovrebbe ottenere l'idea.

+5

Questo non è un polling lungo. È solo un sondaggio. –

+0

Il motivo per cui lo faccio è perché con apache/php spesso si incontrano i timeout delle connessioni lasciando aperta una connessione. Soprattutto se sei dietro un sistema di bilanciamento del carico di Amazon, la connessione scade dopo 30 secondi. IMO meglio sondare ogni paio di secondi. – bonez

+0

Polling è facile. Il polling lungo è difficile in PHP atleast. – doncadavona

5

In realtà non si tratta di un polling lungo se si utilizza il codice bonez. Il polling lungo è se la connessione rimane aperta (magari con un timeout) finché il server non invia una risposta. Se il client invia una richiesta ogni 2 secondi e ottiene una risposta, è solo il polling e si ottiene la risposta del server con ritardo di 2 secondi nel caso peggiore. Con lunghi sondaggi non hai questo ritardo.

Il problema di congelamento non è un errore con Laravel. I blocchi di sessione. Quindi usa session_write_close(); prima di chiamare il metodo di polling lungo o utilizzare il driver di sessione del cookie. Per ulteriori informazioni, vedere http://konrness.com/php5/how-to-prevent-blocking-php-requests/

+0

'session_write_close()' funziona in Laravel ?? Lo sta già chiamando .. – daVe