Co to jest buforowanie danych wyjściowych?

201

Co to jest buforowanie danych wyjściowych i dlaczego używa się go w PHP?

Abhimanyu
źródło

Odpowiedzi:

274

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ą.
topór.
źródło
6
+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?
Thomas Banderas,
69

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.

  • Możesz użyć buforowania wyjściowego w sytuacjach, gdy chcesz zmodyfikować nagłówki po wysłaniu zawartości.

Rozważ ten przykład:

<?php
    ob_start( );
    echo "Hello World";
    if ( $some_error )
    {
        header( "Location: error.php" );
        exit( 0 );
    }
?>
Salman A.
źródło
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.

wprowadź opis zdjęcia tutaj

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.

wprowadź opis zdjęcia tutaj

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.

wprowadź opis zdjęcia tutaj 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 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_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:

http://www.hackingwithphp.com/13/0/0/output-buffering

juliański
źródło
9

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:

Buforowanie danych wyjściowych w PHP

Sarfraz
źródło
1
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

sudip
źródło
0

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 :)

Kamil Dąbrowski
źródło