Vai al contenuto

Output buffering con PHP e ob_flush()

L’output buffering è un’interessante caratteristica di PHP. Quando si esegue uno script PHP e si genera un contenuto di output (codice HTML con la funzione echo ad esempio), tale contenuto HTML viene trasferito dal server al browser. Ma cosa succede se si prova a generare dei contenuti di output mentre si esegue uno script?

Normalmente quando il server è impegnato in qualche operazione, l’output viene momentaneamente sospeso in attesa di terminare lo script. Il motore PHP memorizza gli eventuali contenuti di output in un buffer interno piuttosto che passarli subito al browser. Non appena termina l’esecuzione dello script PHP, il contenuto viene passato al browser e il buffer svuotato. A questo punto entra in gioco l’Output Buffering.

Abbiamo solo bisogno di chiamare una funzione PHP per avviare il buffering PHP. Date un’occhiata a questo blocco di codice:

ob_start();

Come inviare l’output buffer al browser?

Una volta che il buffer di output è stato avviato, nulla sarà visualizzato in output dal browser, a meno che non si utilizzi una specifica funzione oppure  termini l’esecuzione dello script.

Per inviare il contenuto del buffer al browser e quindi visualizzarlo, allora avete bisogno di usare questa funzione:

ob_flush();

La funzione ob_flush() passerà il contenuto del buffer al browser, e lo script PHP continuerà a visualizzare il contenuto del buffer. Cosa bisogna fare se si desidera trasmettere il contenuto dell’output buffer al browser e fermare il riempimento del buffer?Avrete bisogno di questa funzione:

ob_end_flush();

Come eliminare l’output buffer?

Se invece si desidera eliminare tutto il contenuto dal buffer allora avrete bisogno della seguente funzione:

ob_clean();

Come ob_flush(), ob_clean() non interrompe il riempimento del buffer. Per eliminare il buffer e fermare il riempimento del buffer è necessario utilizzare la funzione:

ob_end_clean();

Come controllare i contenuti all’interno dell’Output Buffer?

Abbiamo visto le funzioni per l’eliminazione e l’outputing del contenuto del buffer. Se invece si desidera solamente controllare il contenuto memorizzato nel buffer è possibile utilizzare questa funzione e una semplice variabile PHP:

$var = ob_get_content();

Un piccolo esempio

Per vedere in azione meglio, vi consiglio di creare due file PHP e confrontare l’esecuzione dei due file. Date un’occhiata al blocco di codice qui sotto. Come potete vedere ho usato la funzione phpinfo() e subito dopo sleep(10), per “addormentare” lo script di 10 secondi. In questo caso non ho usato ob_start(). Quello che accade è che viene mostrato il contenuto di phpinfo, lo script si addormenta per 10 secondi e poi termina la sua esecuzione.

phpinfo(); 
sleep(10);

In quest’altro blocco di codice potete vedere la magia dell’output buffer. Ho usato ob_start() prima di chiamare sleep(10) e phpinfo(). In questo caso lo script attenderà 10 secondi prima di mostrare il contenuto di phpinfo, anche se sleep(10) è stato chiamato dopo phpinfo().

ob_start(); 
phpinfo(); 
sleep(10);

Vantaggi

Uno dei principali vantaggi dell’output buffering è il caching. E’ possibile memorizzare nella cache il contenuto (in realtà pagina intera rendering) con l’aiuto dell’output buffering. Proprio per spiegare come funziona. È possibile avviare il buffering e si può tamponare il contenuto intero e alla fine dello script prima eco l’uscita si avrà il contenuto della pagina intera, che è possibile memorizzare nella cache in qualsiasi modo si desidera.