2012-05-08 30 views
5

Duży skrypt php używa koloru, aby wysłać część wygenerowanego html do przeglądarki podczas wykonywania większej części skryptu, który pobiera aplet. 20 sekund.Dlaczego flush PHP nie zawsze działa, strona 1/5 razy niepoprawnie załadowana?

Część skryptu, która jest wykonywana po spłukaniu, jest dość duża i zajmuje dużo rezerw serwera (90% procesora).

Raz na 5 razy strona pozostaje biała (biała), co oznacza, że ​​kolor nie dotarł, aby wysłać obraz pokazujący ładowanie strony. Strona pozostaje otwarta (przeglądarka wskazuje, że wciąż trwa ładowanie) również po zakończeniu programu i powinna wysłać całą stronę do przeglądarki.

Niezwykła: Po naciśnięciu przycisku Wstecz cała strona będzie pokazywać (które powinny być załadowane w przeglądarce po cały skrypt jest wykonywany) na sekundę, a następnie przeglądarka wraca do poprzedniej strony.

Wszystkie pozostałe czterokrotne ładowanie strony. Dane wejściowe dla skryptu php są takie same dla wszystkich 5 razy.

mam te ustawienia w moim pliku .htacces:

addhandler x-httpd-php5-cgi .php5 
addhandler x-httpd-php5-cgi .php5 
addhandler x-httpd-php5-cgi .php5 
Header Set Cache-Control "max-age=0, no-store" 

Jest to oświadczenie do spłukiwania wygenerowany kod do przeglądarki:

print str_pad('',4096)."\n"; 
ob_flush(); 
flush(); 

Co może być przyczyną tego problemu?

+0

Dobra historia, gdzie jest kod? –

+0

@LawrenceCherone Dodałem kod, który opróżnia się do przeglądarki. – BastiaanWW

Odpowiedz

2

Możesz tylko wskazówkę: flush() wysyła go do apache/webserver, który może buforować/czekać, wysyła go do sieci z dowolną liczbą serwerów proxy, które mogą buforować/czekać, co ostatecznie kończy się w przeglądarce, co może również zdecydować się na buforowanie/czekanie. Wybierz metodę asynchroniczną, jeśli nie chcesz poradzić sobie z tymi wszystkimi bólami głowy. Gearman czyni to bardzo łatwym, ale nie koniecznie oczywiście.

2

czy zauważyłeś, że powtarzasz pusty ciąg znaków? Może chodziło

print str_pad(' ',4096)."\n"; 

celem tego zestawienia jest, ponieważ niektóre przeglądarki internetowe nie będą renderować strony, dopóki pewna ilość bajtów zostały otrzymane lub reakcja jest zakończona, co nastąpi wcześniej.

Powiązane problemy