Odpowiedzi:
Buforowanie wyników dla programistów stron internetowych, przewodnik dla początkujących :
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ą.
ob_start()
, tak naprawdę wszystko jest buforowane. jest opcjonalny drugi parametr ob_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:
<?php
ob_start( );
phpinfo( );
$output = ob_get_clean( );
?>
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:
<?php
ob_start( );
echo "Hello World";
if ( $some_error )
{
header( "Location: error.php" );
exit( 0 );
}
?>
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.
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ó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 print or 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 Output Buffering Control
; functions.
; Possible Values:
; On = Enabled and buffer is unlimited. (Use with caution)
; Off = Disabled
; Integer = Enables the buffer and sets its maximum size in bytes.
; Note: This directive is hardcoded to Off for the CLI SAPI
; Default Value: Off
; Development Value: 4096
; Production Value: 4096
; http://php.net/output-buffering
output_buffering = 4096
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.php
Przykład: ob_get_clean ()
Poniżej możesz zobaczyć, jak przechwycić echo
i 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.
http://php.net/manual/en/book.outcontrol.php
Więcej zasobów:
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
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.
Ładnie wyjaśnione tutaj: https://phpfashion.com/everything-about-output-buffering-in-php
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 :)