Jaka jest różnica między ob_flush()
i flush()
i dlaczego muszę dzwonić do obu?
ob_flush()
Referencyjna mówi:
Ta funkcja wyśle zawartość bufora wyjściowego (jeśli istnieje).
flush()
Referencyjna mówi:
Opróżnia bufory zapisu PHP i cokolwiek używanego przez PHP zaplecza (CGI, serwer WWW itp.).
Jednak nadal mówi:
[it] może nie być w stanie zastąpić schematu buforowania Twojego serwera WWW…
Więc wydaje mi się, że mógłbym po prostu wykorzystać ob_flush()
cały czas. Jednak kiedy to robię, uzyskuję dziwne rezultaty. Czy mógłby ktoś wyjaśnić prostymi słowami, co się tutaj dzieje?
output_buffering
opcja konfiguracyjna, której domyślną wartością w wersjach produkcyjnych php.ini jest 4096. Oznacza to, że po uruchomieniu dowolnego skryptu PHP pierwsze 4096 bajtów danych wyjściowych jest buforowanych (w buforze, który można zrzucićob_flush()
). Dlatego konieczne jest użycie,ob_flush()
jak równieżflush()
. Wyłączenieoutput_buffering
przez php.ini lub wywołanieob_end_clean()
lubob_end_flush()
na początku skryptu eliminuje tę konieczność.ob_end_clean()
na „początku skryptu” wydaje się sprzeczne z intuicją. Masz na myśli, że powinniśmy to uwzględnić wkrótce poob_start()
i przed dwoma rzutami?ob_start()
iob_end_clean()
na samym początku skryptu. Następnie po każdym "echo" w trakcie skryptu dołączam równieżob_flush(); flush();
i spodziewam się, że podczas gdy skrypt zajmuje trochę czasu, to, co zostało zrobione do tej pory, zostanie wyświetlone na ekranie (w przeglądarce). Ale nic nie wychodzi do samego końca. czego mi brakuje?ob_flush
opróżnia bufory wyjściowe jesteś stworzony z funkcji takich jakob_start
flush
opróżnia buforowane wyjście skryptu PHP do jego wywołującegoźródło
ob_flush()
jest spłukiwaniem wysokiego poziomu. Opróżnia bufory wysokiego poziomu i umieszcza całą zawartość w wewnętrznych buforach niskiego poziomu, gotowych do wysłania.ob_
rodzina funkcji tworzy stosy buforów, więc zwykłe pisanie na ślepoob_flush()
wszędzie da ci „dziwne wyniki”, jeśli kod został napisany w celu wykorzystania tego łączenia.flush()
jest opróżnianiem niskiego poziomu, instruującym PHP, aby opróżnił wewnętrzne bufory danych niskiego poziomu.Poniżej nadal będą bufory warstwy gniazda; poniżej znajdują się bufory warstwy sieciowej. A na najniższym poziomie kolejka elektronów idących w dół kabla danych.
źródło
ob_start()
iob_end_clean()
na samym początku skryptu. Następnie po każdym "echo" w trakcie skryptu dołączam równieżob_flush(); flush();
i spodziewam się, że podczas gdy skrypt zajmuje trochę czasu, to, co zostało zrobione do tej pory, zostanie wyświetlone na ekranie (w przeglądarce). Ale nic nie wychodzi do samego końca. czego mi brakuje?Myślę, że jest to związane z twoim poprzednim pytaniem . Istotną zaletą korzystania z buforowania danych wyjściowych jest używanie go razem z kompresją danych. Jeśli nie używasz
ob_gzhandler
, niewiele możesz zyskać.flush
sam po prostu zatwierdzi wszystkie dane wyjściowe, które są nadal na serwerze. Zob_start
i jego odpowiednikiob_flush
,ob_end_clean
iob_end_flush
, co czeka na sprężone (spojrzenieflush
iob_flush
jako odnoszące się do różnych wiadrach -ob
wysyła daneflush
,flush
wysyła dane do przeglądarki - nie mogą być dokładne, ale to pomysł) zostaną opakowane i wysłane do klienta .źródło