2008-12-09 17 views
23

Właśnie skończyłem czytać ten wpis: https://developer.yahoo.com/performance/rules.html#flush i już zaimplementowałem kolor po załadowaniu górnej części mojej strony (head, css, top banner/search/nav).PHP Flush: jak często i najlepsze praktyki

Czy występuje uderzenie w spłukiwanie? Czy jest coś takiego jak robienie tego zbyt często? Jakie są najlepsze praktyki?

Jeśli mam zamiar użyć zewnętrznego interfejsu API do przesyłania danych, czy powinien on zostać przepłukany przed rozdaniem, aby użytkownik nie czekał na dane, aby mógł powrócić, i może przynajmniej uzyskać pewne dane przed rozdaniem?

+1

Ponieważ jest to wciąż czytane: rozważ zamiast tego niektóre asynchroniczne przetwarzanie z powiadomieniami o wyniku za pośrednictwem np. websockets. (To nie było A, kiedy zadano pytanie). – Piskvor

Odpowiedz

19

Technika opisana ładnie wygląda, ale ma kilka pułapek:

1) czas pomiędzy początkiem i końcem skryptu PHP jest niewielka w porównaniu do czasu nadawania; również, to oszczędza użytkownikowi około 0,5 sekundy, zgodnie z Twoim źródłem. Czy to dla ciebie znacząca ilość czasu?

2) metoda ta nie działa z buforowaniem wyjścia gzip

3) jeśli spłukiwania zbyt często, będziesz wysyłając niemal pustą paczkę na kolor, który może rzeczywiście zwiększyć czas ładowania (na powolne , głośne połączenia).

4) po równo, nie można wysyłać więcej nagłówków

5) (niewielki problem) odpowiedź serwera przyjdzie pakietowego kodowania, co oznacza, że ​​klient nie będzie wiedział z góry rozmiaru (dlatego nie wyświetla "x% zrobione" podczas pobierania pliku).

Z drugiej strony, jeśli spodziewasz się, że skrypt uruchomi się na dłuższy czas (ponad 20 sekund), może być konieczne przesłanie niektórych danych (np. Spacji), aby przeglądarka nie przerywała połączenia.

5

Wadą jest to, że nie można gzip zawartości, a także spłukiwanie go afaik, więc zawsze wolałem gzip niż flush.

Some versions of Microsoft Internet Explorer will only start to display the page after they have received 256 bytes of output, so you may need to send extra whitespace before flushing to get those browsers to display the page.

To sprawia, że ​​to nie pomysł, jak się wydaje wyściółka więcej danych nie jest bardzo przydatna.

+0

Zgadzam się, jednak większość ludzi ma więcej metadanych wewnątrz swoich tagów head niż 256 znaków. To nie jest tak dużo, jeśli o tym myślisz. Jednak GZip jest dobrym punktem. –

2

Idąc za punktem Piskvor - jeśli spodziewasz się 20-sekundowego czekania, możesz lepiej przygotować podstawową stronę (którą można spakować gzipem) i użyć Ajax do aktualizacji strony po zakończeniu powolnego procesu. Zaczynasz jednak naruszać podstawową przydatność statycznego html.

3

Myślę, że kolor jest naprawdę drobnym mechanizmem strojenia. Przeglądarki używają tylko około 8 wątków do pobierania treści (w zależności od przeglądarki). Jeśli masz 15 zdjęć, przeglądarka rozpocznie pobieranie 8 obrazów i nie będzie pobierać niczego innego, dopóki jedna z nich nie zakończy, wtedy zacznie pobierać następny obraz, itd. Płukanie po nagłówku, zasadniczo mówi przeglądarce, co może rozpocząć pobieranie. Do czasu dostarczenia pozostałej części strony (tj. 0,5 sekundy później) przeglądarka mogła już zakończyć pobieranie plików css i javascript. Spowoduje to zwolnienie wątków pobierania dla innych treści.

Prawdopodobnie nie chcesz używać funkcji flush w żadnym innym miejscu niż tuż po nagłówku. Przeglądarka zwykle nie renderuje niezamkniętych znaczników html, więc dostarczenie częściowej strony nie spowoduje wyświetlania elementów szybciej. Starsze wersje IE nie wyświetlają niczego, dopóki pewna ilość danych nie zostanie odebrana lub dostawa strony jest zakończona.