2012-12-18 17 views
5

Di seguito è riportato il codice con cui ho terminato l'implementazione della cometa.cakephp comet usleep blocca tutto

$lastmodif = isset($this->params['form']['timestamp']) ? $this->params['form']['timestamp'] : 0; 
$currentmodif = $already_updated[0]['Update']['lastmodified']; 

while ($currentmodif <= $lastmodif) 
{ 
    usleep(5000000); 
    clearstatcache(); 
    $already_updated_new = $this->Update->find('all',array 
    (
     'conditions' => array 
     ( 
      'Update.receiver_id' => $this->Auth->user('id'), 
      'Update.table_name' => "request_responses" 
     ) 
    )); 
    $currentmodif = $already_updated_new[0]['Update']['lastmodified']; 
}

$already_updated[0]['Update']['lastmodified'] è il risultato della query per ottenere l'ultimo timestamp aggiornato della tabella.

Nel codice precedente $ lastmodif e $ currentmodif è il timestamp che viene passato dopo ogni risposta corretta della cometa.

Ma ora il problema è che quando faccio clic su altri collegamenti nella stessa pagina non accade nulla, ma dopo aver atteso così a lungo il suo reindirizzamento.

penso che usleep blocca altre richieste HTTP.

sto usando mysql e cakephp per favore ragazzi guidami cosa devo fare per risolvere questo problema.

Ho provato a svuotare quando viene chiamato la pagina ma non è possibile modificare l'errore di intestazione perché l'output è già stato inviato.

Grazie.

+0

Hai trovato una soluzione per questo? se l'hai fatto, ti preghiamo di scrivere una risposta, se non lo facessi, sarebbe utile se fornisci il codice di visualizzazione. Potrei essere in grado di aiutarti. – luchomolina

+0

Non l'ho trovato ... –

risposta

5

Ho incontrato situazioni simili diverse volte. Sembra che Session sia bloccata dal tuo script dormiente.

Come risolvere in CakePHP:
chiamata session_write_close(); all'inizio del vostro script.
Non esiste un modo per farlo tramite Cake's Session Component o Helper
Nota: Se qualcosa all'interno dello script utilizza session - Cake riaprirà la sessione e bloccherà tutte le richieste che utilizzano nuovamente la stessa sessione.In questo caso dovrai chiudere la sessione prima di andare a dormire o prima di qualsiasi operazione che richieda molto tempo.

+0

+1 per te perché capisci perfettamente il problema ... –

0

Sì, l'usleep sta bloccando ulteriori richieste. A seconda del tuo ambiente di hosting, probabilmente disponi di una quantità limitata di processi disponibili. Presumo che tu abbia più utenti nella tua chat -> tutti rilasciano processi di blocco a meno che nessuno non sia disponibile, ecco perché il tuo altro timeout "link".

vorrei suggerire di implementare l'attesa sul lato client-browser, ad esempio

setTimeout(function() { 
    fetchAndPrintTheNewChats(); 
}, 50000000); 

Qualsiasi approccio per fare questo all'interno del codice PHP comporterà lo stesso problema.

+0

grazie per la risposta ma non voglio suggerimenti, voglio usare comet perché se questo problema risolve allora risolverà automaticamente il mio così tanti problemi perché altri problemi si basano su questo problema. .Grazie. –

1

Se lo script utilizza sessioni, è possibile notare tale comportamento. PHP blocca il file di sessione fino al completamento dello script.

Ciò significa che quando uno script inizia una sessione, qualsiasi altro script che tenta di avviare una sessione utilizzando lo stesso ID di sessione è bloccato fino a quando lo script precedente non rilascia il blocco (o termina).

La soluzione per questo è quello di sbloccare la sessione prima di ogni lungo processo:

  • chiamata session_start()
  • di lettura/scrittura tutte le variabili di sessione
  • chiamata session_write_close()
  • fare una lunga elaborazione
+0

corretto lo so ma non so come farlo in modo cakephp. –

+0

Ho esaminato la documentazione ma non ho trovato alcun metodo "vicino". Puoi chiamare 'session_write_close' da solo e vedere se questo aiuta. –