2013-01-02 25 views
10

Avevo impostato un server con script di evento inviato con php e un ciclo while, non volevo che lo script continuasse a chiudersi e dover fare il repoll, quindi ho inserito tutto in un ciclo while.Come implementare gli eventi inviati dal server in PHP?

Il problema era che la sceneggiatura si stava bloccando e ho dovuto abbandonare quella strada e sono andato invece con un backend websocket node.js.

La mia domanda è, se mai sono tornato a fare un server inviato script php evento, come posso implementarlo?
while I loop non sembrano tagliarli in quanto appende lo script, e se si collega e disconnette ogni secondo, non è diverso dal polling lungo, quindi come posso creare uno script PHP che non si blocchi, mentre inviando i messaggi SSE?

+0

Si potrebbe inserire un 'sleep()' nel ciclo per allentarlo. – Musa

+0

@Musa L'ho fatto senza successo. Era ancora appeso. – Neal

+0

non è un'opzione? –

risposta

5

Sembravi avere problemi con il buffering dell'output php. Prova ad aggiungere questi riga alla fine del ciclo while:

ob_flush(); 
flush(); 

Questo dovrebbe disattivare l'output buffering.

EDIT È anche possibile terminare lo script dopo un po 'di tempo (ovvero 10 minuti) per ridurre il carico del server.

Ho creato una libreria per farti fare molto facilmente. Controllalo here.

Secondo Modifica Avete un proxy inverso come nginx o vernice? Questo potrebbe essere il motivo perché il proxy tenta di memorizzare nella cache il contenuto dell'output, ma lo script SSE non termina mai fino a quando non lo si interrompe, quindi l'intera procedura si blocca. Altre cose che catturano l'output potrebbero avere risultati simili come mod_deflate.

Terza modifica Se si dispone di un proxy inverso, è possibile provare a disattivare la memorizzazione nella cache per consentire il funzionamento di SSE.

Ci sono altri modi in PHP per disabilitare il buffering dell'output. Vedere il codice di seguito:

<?php 
for($i=0;$i<ob_get_level();$i++){ 
    ob_end_flush(); 
} 
@apache_setenv('no-gzip',1); 
@ini_set('implict_flush',1); 
ob_implict_flush(true); 
+1

Questo è coerente con una risposta che ho dato a una domanda simile: http://stackoverflow.com/questions/7469396/how-to-implement-event-listening-in-php/8660897#8660897 – igorw

Problemi correlati