Che cos'è il buffering dell'output?


Risposte:


274

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.

6
+1. Ecco un altro link utile: php.net/manual/en/function.ob-start.php - utile anche quando si ha a che fare con una funzione che riecheggia un valore che si preferisce memorizzare in una variabile.
Cam

È davvero tutto bufferizzato fino alla fine, o la pagina verrà solo in pezzi se ho una pagina davvero lunga?
zedoo,

5
@zedoo se inizi il buffering dell'output ob_start(), in realtà tutto è bufferizzato. esiste un secondo parametro facoltativo su ob_start(), int $chunk_sizeche, 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.
ax.

12
Se viene visualizzato il messaggio "Avviso: impossibile modificare le informazioni dell'intestazione", ciò significa che è necessario controllare prima il codice poiché l'abilitazione del buffering dell'output è una correzione del sintomo e non della causa. Qualcosa sta scrivendo prima che sia il turno. Quindi non sono d'accordo, ma non abbastanza per annullare la risposta.
Glenn Plas,

5
Vedo solo le avventure dell'utilizzo del buffering, quindi perché non è abilitato per impostazione predefinita in php?
Thomas Banderas,

69

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.

  • È possibile utilizzare il buffering dell'output in situazioni in cui si desidera modificare le intestazioni dopo aver inviato il contenuto.

Considera questo esempio:

<?php
    ob_start( );
    echo "Hello World";
    if ( $some_error )
    {
        header( "Location: error.php" );
        exit( 0 );
    }
?>

Stessa domanda qui per Ax: non sta iniziando il buffering dell'output senza spegnerlo più tardi, andando a far girare lo script in tutti i tipi di problemi?
Edward Stumperd,

1
Il buffer viene scaricato quando si chiama uno dei metodi di scarico (ad es. 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.
Salman,

17

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, echoinvierà immediatamente i dati al browser.

inserisci qui la descrizione dell'immagine

Se il buffering di output è attivato, quindi echoinvierà i dati al buffer di output prima di inviarli al browser.

inserisci qui la descrizione dell'immagine

phpinfo

Per vedere se il buffering dell'output è attivato / disattivato, consultare phpinfo nella sezione principale. La output_bufferingdirettiva ti dirà se il buffering dell'output è attivato / disattivato.

inserisci qui la descrizione dell'immagine In questo caso il output_bufferingvalore è 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_bufferingdirettiva. 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_bufferingnon è 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 echoe 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:

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


9

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:

Buffering dell'uscita con PHP


4

Come suggerisce il nome qui buffer di memoria utilizzato per gestire l'aspetto dell'output dello script.

Ecco un ottimo tutorial per l'argomento


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

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


0

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.