2013-01-02 9 views
10

Założyłem skrypt zdarzeń wysłanych przez serwer z php i pętlą while, nie chciałem, aby skrypt nadal się zamykał i trzeba było go powtórzyć, więc umieściłem go w pętli.Jak zaimplementować Server Sent Events w PHP?

Problem polegał na tym, że skrypt utknął i musiałem zrezygnować z tej trasy, a zamiast tego pojechałem z websemocket node.js.

Moje pytanie brzmi: czy kiedykolwiek wróciłem do tworzenia skryptu php dla serwera wysłanego, jak go zaimplementować?
while pętle nie wydają się wycinać, ponieważ zawiesza się skrypt, a jeśli jest to po prostu łączenie i rozłączanie w każdej sekundzie, to nie różni się od długiego sondowania, więc jak utworzyć skrypt PHP, który się nie zawiesi, a także wysyłanie wiadomości SSE?

+0

Możesz umieścić w pętli funkcję "sleep()", aby ją poluzować. – Musa

+0

@Musa Zrobiłem to bez skutku. Wciąż wisiał. – Neal

+0

jest nohup opcja? –

Odpowiedz

5

Wygląda na to, że masz problem z buforowaniem wyjścia php. Spróbuj dodać te linie na końcu pętli while:

ob_flush(); 
flush(); 

Należy wyłączyć buforowanie wyjścia.

EDYCJA Możesz również zakończyć skrypt po pewnym czasie (np. 10 minut), aby zmniejszyć obciążenie serwera.

Stworzyłem bibliotekę, abyś mógł to zrobić bardzo łatwo. Sprawdź to here.

Druga edycja Czy masz odwrotne proxy, takie jak nginx lub lakier? Może to być spowodowane tym, że proxy próbuje buforować zawartość danych wyjściowych, ale skrypt SSE nigdy się nie kończy, dopóki go nie zatrzymasz, aby wszystko się zawiesiło. Inne rzeczy przechwytujące dane wyjściowe mogą mieć podobne wyniki, na przykład mod_deflate.

Trzecia edycja Jeśli masz reverse proxy, można spróbować wyłączyć buforowanie w celu umożliwienia SSE do pracy.

Istnieje kilka sposobów wyłączenia buforowania wyjściowego w PHP. Zobacz poniższy kod:

<?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

Jest to zgodne z odpowiedzią udzieloną na podobne pytanie: http://stackoverflow.com/questions/7469396/how-to-implement-event-listening-in-php/8660897#8660897 – igorw