Bez buforowania danych wyjściowych (domyślnie) kod HTML jest wysyłany do przeglądarki w kawałkach, podczas gdy PHP przetwarza skrypt. Dzięki buforowaniu danych wyjściowych kod HTML jest przechowywany w zmiennej i wysyłany do przeglądarki jako jeden element na końcu skryptu.
Zalety buforowania danych wyjściowych dla twórców stron internetowych
Włączenie samego buforowania danych wyjściowych skraca czas pobierania i renderowania naszego HTML, ponieważ nie jest on wysyłany do przeglądarki w kawałkach, gdy PHP przetwarza HTML.
Wszystkie fantazyjne rzeczy, które możemy zrobić z łańcuchami PHP, możemy teraz zrobić z całą naszą stroną HTML jako jedną zmienną.
Jeśli kiedykolwiek napotkałeś komunikat „Ostrzeżenie: nie można modyfikować informacji nagłówka - nagłówki już wysłane przez (wyjście)” podczas ustawiania plików cookie, z przyjemnością dowiesz się, że buforowanie danych wyjściowych jest Twoją odpowiedzią.
+1. Oto kolejny pomocny link: php.net/manual/en/function.ob-start.php - pomocny także w przypadku funkcji, która odzwierciedla wartość, którą wolisz przechowywać w zmiennej.
Cam
Czy naprawdę wszystko jest buforowane do końca, czy strona będzie po prostu podzielona na kawałki, jeśli mam naprawdę długą stronę?
zedoo
5
@zedoo, jeśli zaczniesz buforowanie danych wyjściowych ob_start(), tak naprawdę wszystko jest buforowane. jest opcjonalny drugi parametr ob_start(), int $chunk_sizektóre gdy zestaw spowoduje bufor do spłukuje po zastosowaniu połączenia wyjściowego, co powoduje długość bufora do równa lub przekracza tę wielkość.
siekiera.
12
Jeśli pojawi się komunikat „Ostrzeżenie: nie można modyfikować informacji w nagłówku”, oznacza to, że musisz najpierw zweryfikować kod, ponieważ włączenie buforowania danych wyjściowych jest naprawą symptomu, a nie przyczyny. Coś pisze przed swoją koleją. Nie zgadzam się z tym, ale nie na tyle, by podważyć odpowiedź.
Glenn Plas,
5
Widzę tylko zalety korzystania z buforowania, więc dlaczego nie jest domyślnie włączony w php?
To samo pytanie, co w przypadku Axa: czy nie uruchamia się buforowania danych wyjściowych bez jego późniejszego wyłączenia, czy spowoduje to, że skrypt napotka różne problemy?
Edward Stumperd,
1
Bufor jest opróżniany po wywołaniu jednej z metod opróżniania (np. ob_flush()Lub ob_end_flush()). Zawartość bufora jest również opróżniana po zakończeniu skryptu, nagle lub w inny sposób, więc nie powinno być problemu.
Salman A,
17
Wiem, że to stare pytanie, ale chciałem napisać odpowiedź dla uczniów wizualnych. Nie mogłem znaleźć żadnych diagramów wyjaśniających buforowanie danych wyjściowych w sieci WWW, więc sam stworzyłem schemat w systemie Windows mspaint.exe.
Jeśli buforowanie danych wyjściowych jest wyłączone, echodane będą wysyłane natychmiast do przeglądarki.
Jeśli buforowanie danych wyjściowych jest włączone, to an echowyśle dane do bufora danych wyjściowych przed wysłaniem ich do przeglądarki.
phpinfo
Aby sprawdzić, czy buforowanie wyjścia jest włączone / wyłączone, zapoznaj się z phpinfo w sekcji głównej. output_bufferingDyrektywa powie, czy buforowanie wyjścia jest on / off.
W tym przypadku output_bufferingwartość wynosi 4096, co oznacza, że rozmiar bufora wynosi 4 KB. Oznacza to również, że buforowanie danych wyjściowych jest włączone na serwerze WWW.
php.ini
Możliwe jest włączanie / wyłączanie i zmiana rozmiaru bufora poprzez zmianę wartości output_bufferingdyrektywy. Wystarczy go znaleźć php.ini, zmienić na wybrane ustawienie i zrestartować serwer WWW. Poniżej znajduje się moja próbka php.ini.
;Output buffering is a mechanism for controlling how much output data
;(excluding headers and cookies) PHP should keep internally before pushing that
; data to the client.If your application's output exceeds this setting, PHP
; will send that data in chunks of roughly the size you specify.
; Turning on this setting and managing its maximum buffer size can yield some
; interesting side-effects depending on your application and web server.
; You may be able to send headers and cookies after you've already sent output
; through printor echo.You also may see performance benefits if your server is; emitting less packets due to buffered output versus PHP streaming the output
;as it gets it.On production servers,4096 bytes is a good setting for performance
; reasons.;Note:Output buffering can also be controlled via OutputBufferingControl; functions.;PossibleValues:;On=Enabledand buffer is unlimited.(Usewith caution);Off=Disabled;Integer=Enables the buffer and sets its maximum size in bytes.;Note:This directive is hardcoded to Offfor the CLI SAPI
;DefaultValue:Off;DevelopmentValue:4096;ProductionValue:4096; http://php.net/output-buffering
output_buffering =4096
Dyrektywa output_bufferingnie jest jedyną konfigurowalną dyrektywą dotyczącą buforowania danych wyjściowych. Inne konfigurowalne dyrektywy dotyczące buforowania danych wyjściowych można znaleźć tutaj: http://php.net/manual/en/outcontrol.configuration.php
Przykład: ob_get_clean ()
Poniżej możesz zobaczyć, jak przechwycić echoi manipulować nim przed wysłaniem go do przeglądarki.
// Turn on output buffering
ob_start();
echo 'Hello World';// save to output buffer
$output = ob_get_clean();// Get content from the output buffer, and discard the output buffer ...
$output = strtoupper($output);// manipulate the output
echo $output;// send to output stream / Browser// OUTPUT:
HELLO WORLD
Przykłady: Hackingwithphp.com
Więcej informacji o buforze wyjściowym z przykładami można znaleźć tutaj:
Funkcje kontroli wyjścia pozwalają kontrolować, kiedy dane wyjściowe są wysyłane ze skryptu. Może to być przydatne w kilku różnych sytuacjach, szczególnie jeśli musisz wysłać nagłówki do przeglądarki po tym, jak skrypt zacznie wyprowadzać dane. Funkcje kontroli wyjścia nie wpływają na nagłówki wysyłane za pomocą header () lub setcookie (), tylko funkcje takie jak echo () i dane między blokami kodu PHP.
ob_start();// turns on output buffering
$foo->bar();// all output goes only to buffer
ob_clean();// delete the contents of the buffer, but remains buffering active
$foo->render();// output goes to buffer
ob_flush();// send buffer output
$none = ob_get_contents();// buffer content is now an empty string
ob_end_clean();// turn off output buffering
Bufory można zagnieżdżać, więc gdy jeden bufor jest aktywny, drugi ob_start()aktywuje nowy bufor. Tak więc ob_end_flush()i ob_flush()tak naprawdę nie wysyłają bufora do wyjścia, ale do bufora nadrzędnego. I tylko wtedy, gdy nie ma bufora nadrzędnego, zawartość jest wysyłana do przeglądarki lub terminala.
AKTUALIZACJA 2019. Jeśli masz dedykowany serwer i dysk SSD lub lepszy NVM, 3.5GHZ. Nie powinieneś używać buforowania, aby szybciej ładować stronę internetową w 100ms-150ms.
Sieć Bo jest wolniejsza niż przetwarzanie skryptu w 2019 roku z serwerami wydajności (serwery, pamięć, dysk) i włączeniem APC PHP :) Aby wygenerowany skrypt czasami potrzebował tylko 70 ms, innym razem tylko sieć wymaga czasu, od 10 ms do 150 ms od lokalizacji serwer użytkownika.
więc jeśli chcesz być szybki 150ms, buforowanie powoduje spowolnienie, ponieważ potrzebujesz dodatkowych danych bufora gromadzenia, powoduje to dodatkowy koszt. 10 lat temu, kiedy serwer tworzy skrypt 1s, było to przydatne.
Proszę, pamiętaj, że wyjście_buforowanie ma limit, jeśli chcesz użyć jpg do załadowania, możesz opróżnić automatyzację i wysyłanie awarii.
Twoje zdrowie.
Możesz zrobić szybką rzekę lub bezpiecznie zrobić Tama :)
ob_start()
, tak naprawdę wszystko jest buforowane. jest opcjonalny drugi parametrob_start()
,int $chunk_size
które gdy zestaw spowoduje bufor do spłukuje po zastosowaniu połączenia wyjściowego, co powoduje długość bufora do równa lub przekracza tę wielkość.Buforowanie danych wyjściowych jest wykorzystywane przez PHP do poprawy wydajności i wykonania kilku sztuczek.
Możesz poprosić PHP o przechowywanie wszystkich danych wyjściowych w buforze i wysyłanie wszystkich danych naraz, co poprawia wydajność sieci.
W niektórych sytuacjach możesz uzyskać dostęp do zawartości bufora bez wysyłania jej z powrotem do przeglądarki.
Rozważ ten przykład:
Powyższy przykład przechwytuje dane wyjściowe do zmiennej zamiast wysyłać je do przeglądarki. output_buffering jest domyślnie wyłączony.
Rozważ ten przykład:
źródło
ob_flush()
Lubob_end_flush()
). Zawartość bufora jest również opróżniana po zakończeniu skryptu, nagle lub w inny sposób, więc nie powinno być problemu.Wiem, że to stare pytanie, ale chciałem napisać odpowiedź dla uczniów wizualnych. Nie mogłem znaleźć żadnych diagramów wyjaśniających buforowanie danych wyjściowych w sieci WWW, więc sam stworzyłem schemat w systemie Windows
mspaint.exe
.Jeśli buforowanie danych wyjściowych jest wyłączone,
echo
dane będą wysyłane natychmiast do przeglądarki.Jeśli buforowanie danych wyjściowych jest włączone, to an
echo
wyśle dane do bufora danych wyjściowych przed wysłaniem ich do przeglądarki.phpinfo
Aby sprawdzić, czy buforowanie wyjścia jest włączone / wyłączone, zapoznaj się z phpinfo w sekcji głównej.
output_buffering
Dyrektywa powie, czy buforowanie wyjścia jest on / off.W tym przypadku
output_buffering
wartość wynosi 4096, co oznacza, że rozmiar bufora wynosi 4 KB. Oznacza to również, że buforowanie danych wyjściowych jest włączone na serwerze WWW.php.ini
Możliwe jest włączanie / wyłączanie i zmiana rozmiaru bufora poprzez zmianę wartości
output_buffering
dyrektywy. Wystarczy go znaleźćphp.ini
, zmienić na wybrane ustawienie i zrestartować serwer WWW. Poniżej znajduje się moja próbkaphp.ini
.Dyrektywa
output_buffering
nie jest jedyną konfigurowalną dyrektywą dotyczącą buforowania danych wyjściowych. Inne konfigurowalne dyrektywy dotyczące buforowania danych wyjściowych można znaleźć tutaj: http://php.net/manual/en/outcontrol.configuration.phpPrzykład: ob_get_clean ()
Poniżej możesz zobaczyć, jak przechwycić
echo
i manipulować nim przed wysłaniem go do przeglądarki.Przykłady: Hackingwithphp.com
Więcej informacji o buforze wyjściowym z przykładami można znaleźć tutaj:
http://www.hackingwithphp.com/13/0/0/output-buffering
źródło
http://php.net/manual/en/book.outcontrol.php
Więcej zasobów:
Buforowanie danych wyjściowych w PHP
źródło
Jak sugeruje nazwa, bufor pamięci służy do zarządzania wyglądem wyników skryptu.
Oto jeden bardzo dobry samouczek na ten temat
źródło
Bufory można zagnieżdżać, więc gdy jeden bufor jest aktywny, drugi
ob_start()
aktywuje nowy bufor. Tak więcob_end_flush()
iob_flush()
tak naprawdę nie wysyłają bufora do wyjścia, ale do bufora nadrzędnego. I tylko wtedy, gdy nie ma bufora nadrzędnego, zawartość jest wysyłana do przeglądarki lub terminala.Ładnie wyjaśnione tutaj: https://phpfashion.com/everything-about-output-buffering-in-php
źródło
AKTUALIZACJA 2019. Jeśli masz dedykowany serwer i dysk SSD lub lepszy NVM, 3.5GHZ. Nie powinieneś używać buforowania, aby szybciej ładować stronę internetową w 100ms-150ms.
Sieć Bo jest wolniejsza niż przetwarzanie skryptu w 2019 roku z serwerami wydajności (serwery, pamięć, dysk) i włączeniem APC PHP :) Aby wygenerowany skrypt czasami potrzebował tylko 70 ms, innym razem tylko sieć wymaga czasu, od 10 ms do 150 ms od lokalizacji serwer użytkownika.
więc jeśli chcesz być szybki 150ms, buforowanie powoduje spowolnienie, ponieważ potrzebujesz dodatkowych danych bufora gromadzenia, powoduje to dodatkowy koszt. 10 lat temu, kiedy serwer tworzy skrypt 1s, było to przydatne.
Proszę, pamiętaj, że wyjście_buforowanie ma limit, jeśli chcesz użyć jpg do załadowania, możesz opróżnić automatyzację i wysyłanie awarii.
Twoje zdrowie.
Możesz zrobić szybką rzekę lub bezpiecznie zrobić Tama :)
źródło