Risposte:
Buffering dell'output per sviluppatori Web, una guida per principianti :
Senza buffering dell'output (impostazione predefinita), il codice HTML viene inviato al browser a pezzi mentre PHP viene elaborato tramite lo script. Con il buffering dell'output, il codice HTML viene archiviato in una variabile e inviato al browser come un pezzo unico alla fine dello script.
Vantaggi del buffering dell'output per gli sviluppatori Web
- L'attivazione del buffering dell'output da solo riduce la quantità di tempo necessaria per scaricare e rendere il nostro HTML perché non viene inviato al browser a pezzi mentre PHP elabora l'HTML.
- Tutte le cose fantasiose che possiamo fare con le stringhe PHP, ora possiamo fare con tutta la nostra pagina HTML come una variabile.
- Se hai mai incontrato il messaggio "Avvertenza: impossibile modificare le informazioni dell'intestazione - intestazioni già inviate da (output)" durante l'impostazione dei cookie, sarai felice di sapere che il buffering dell'output è la tua risposta.
ob_start()
, in realtà tutto è bufferizzato. esiste un secondo parametro facoltativo su ob_start()
, int $chunk_size
che, se impostato, farà svuotare il buffer dopo ogni chiamata di output che fa sì che la lunghezza del buffer sia uguale o superiore a questa dimensione.
Il buffering dell'output viene utilizzato da PHP per migliorare le prestazioni ed eseguire alcuni trucchi.
Puoi fare in modo che PHP memorizzi tutti gli output in un buffer e li produca tutti contemporaneamente migliorando le prestazioni della rete.
È possibile accedere al contenuto del buffer senza rispedirlo al browser in determinate situazioni.
Considera questo esempio:
<?php
ob_start( );
phpinfo( );
$output = ob_get_clean( );
?>
L'esempio sopra cattura l'output in una variabile invece di inviarlo al browser. output_buffering è disattivato per impostazione predefinita.
Considera questo esempio:
<?php
ob_start( );
echo "Hello World";
if ( $some_error )
{
header( "Location: error.php" );
exit( 0 );
}
?>
ob_flush()
O ob_end_flush()
). Il contenuto del buffer viene scaricato anche quando lo script termina, improvvisamente o in altro modo, quindi non dovrebbe esserci un problema.
So che questa è una vecchia domanda, ma volevo scrivere la mia risposta per gli studenti visivi. Non sono riuscito a trovare alcun diagramma che spiegasse il buffering dell'output sul web in tutto il mondo, quindi ho creato un diagramma da solo in Windows mspaint.exe
.
Se il buffer di output è disattivato, echo
invierà immediatamente i dati al browser.
Se il buffering di output è attivato, quindi echo
invierà i dati al buffer di output prima di inviarli al browser.
phpinfo
Per vedere se il buffering dell'output è attivato / disattivato, consultare phpinfo nella sezione principale. La output_buffering
direttiva ti dirà se il buffering dell'output è attivato / disattivato.
In questo caso il output_buffering
valore è 4096, il che significa che la dimensione del buffer è 4 KB. Significa anche che il buffering dell'output è attivato sul server Web.
php.ini
È possibile attivare / disattivare e modificare la dimensione del buffer modificando il valore della output_buffering
direttiva. Basta trovarlo php.ini
, modificarlo sull'impostazione desiderata e riavviare il server Web. Di seguito puoi trovare un esempio del mio 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
La direttiva output_buffering
non è l'unica direttiva configurabile relativa al buffering dell'output. Puoi trovare altre direttive configurabili per il buffering dell'output qui: http://php.net/manual/en/outcontrol.configuration.php
Esempio: ob_get_clean ()
Di seguito puoi vedere come catturarlo echo
e manipolarlo prima di inviarlo al browser.
// 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
Esempi: Hackingwithphp.com
Ulteriori informazioni sul buffer di output con esempi sono disponibili qui:
Le funzioni di controllo dell'output consentono di controllare quando l'output viene inviato dallo script. Ciò può essere utile in diverse situazioni, in particolare se è necessario inviare intestazioni al browser dopo che lo script ha iniziato a produrre dati. Le funzioni di controllo dell'output non influiscono sulle intestazioni inviate usando header () o setcookie (), solo funzioni come echo () e dati tra blocchi di codice PHP.
http://php.net/manual/en/book.outcontrol.php
Altre risorse:
Come suggerisce il nome qui buffer di memoria utilizzato per gestire l'aspetto dell'output dello script.
Ecco un ottimo tutorial per l'argomento
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
I buffer possono essere nidificati, quindi mentre un buffer è attivo, un altro ob_start()
attiva un nuovo buffer. Quindi ob_end_flush()
e ob_flush()
non stanno davvero inviando il buffer all'output, ma al buffer principale. E solo quando non esiste un buffer principale, i contenuti vengono inviati al browser o al terminale.
Ben spiegato qui: https://phpfashion.com/everything-about-output-buffering-in-php
AGGIORNAMENTO 2019. Se si dispone di server e SSD dedicati o NVM migliore, 3,5 GHZ. Non è necessario utilizzare il buffering per rendere il sito Web caricato più velocemente in 100ms-150ms.
Perché la rete è lentamente che procreare lo script nel 2019 con server delle prestazioni (server, memoria, disco) e con l'accensione di PHP APC :) Per generare script a volte servono solo 70 ms un'altra volta è solo la rete richiede tempo, da 10 ms a 150 ms dalla posizione utente-server.
quindi se vuoi essere veloce 150ms, il buffering rallenta, perché hai bisogno di ulteriori dati sul buffer di raccolta che comporti un costo aggiuntivo. 10 anni fa, quando il server creava 1s script, era utile.
Per favore, perché output_buffering ha un limite se vuoi usare jpg per caricarlo, puoi scaricare automaticamente e mandare in crash.
Saluti.
Puoi fare river veloce o puoi fare tama in sicurezza :)