set_file_buffer()
Scopri come stream_set_write_buffer() in PHP controlla il buffering di scrittura su uno stream, perché set_file_buffer() è deprecata e come disabilitare il buffering.
Introduzione
In PHP, la funzione stream_set_write_buffer() viene utilizzata per impostare la dimensione del buffer di scrittura di uno stream di file. È una funzione utile per ottimizzare le prestazioni degli script PHP, controllando in che modo i dati vengono scritti su disco. Si noti che la vecchia funzione set_file_buffer() è stata deprecata in PHP 4.3.0 e rimossa in PHP 5.0.0, quindi stream_set_write_buffer() è l'approccio moderno corretto. In questo articolo, illustreremo tutto ciò che è necessario sapere sulla funzione stream_set_write_buffer(), inclusa la sua sintassi, i parametri e degli esempi di utilizzo.
Comprensione della funzione stream_set_write_buffer()
La funzione stream_set_write_buffer() in PHP viene utilizzata per impostare la dimensione del buffer di scrittura di uno stream. Accetta due parametri: la risorsa stream e la dimensione del buffer in byte.
Quando si usa stream_set_write_buffer(), PHP configura lo stream per memorizzare nel buffer fino al numero di byte specificato prima di scrivere i dati su disco. Impostare la dimensione del buffer a 0 disabilita completamente il buffering, una configurazione comune per l'output in tempo reale. Il buffer viene svuotato automaticamente quando raggiunge la dimensione specificata, al termine dello script, oppure quando si chiama esplicitamente fflush() sullo stream. Configurare questo valore in modo appropriato può essere utile per ottimizzare le prestazioni degli script PHP, specialmente quando si scrivono grandi quantità di dati.
Sintassi della funzione stream_set_write_buffer()
La sintassi della funzione stream_set_write_buffer() è la seguente:
stream_set_write_buffer($stream, $buffer);I parametri sono:
$stream— una risorsa stream scrivibile, tipicamente restituita dafopen().$buffer— la dimensione del buffer in byte. Usare0per disabilitare il buffering in modo che ogni scrittura venga eseguita immediatamente.
Secondo il manuale PHP, la funzione restituisce 0 in caso di successo. In pratica il valore di ritorno dipende dalla piattaforma (alcuni sistemi restituiscono un valore diverso da zero anche quando il buffering è configurato correttamente), quindi non si dovrebbe fare affidamento su di esso. Se è necessario forzare uno svuotamento del buffer, chiamare fflush() invece di affidarsi al codice di ritorno.
Esempi di utilizzo di stream_set_write_buffer()
Vediamo un esempio di come la funzione stream_set_write_buffer() può essere utilizzata in PHP.
Esempio 1: Impostare il buffer di file
<?php
$file_handle = fopen('example.txt', 'w');
stream_set_write_buffer($file_handle, 1024);
fwrite($file_handle, 'Hello, world!');
fclose($file_handle);Questo esempio apre il file example.txt in scrittura e imposta il buffer di scrittura a 1024 byte. PHP trattiene ora i dati scritti in memoria finché non si accumulano 1024 byte, finché non si chiama fflush(), oppure finché lo stream non viene chiuso con fclose() — che svuota tutti i dati bufferizzati rimanenti e libera le risorse di sistema. Chiudere sempre l'handle al termine.
Esempio 2: Disabilitare il buffering per scritture immediate
Quando si desidera che ogni scrittura raggiunga il disco immediatamente — ad esempio quando si scrive un file di log che un altro processo legge in tempo reale — impostare la dimensione del buffer a 0:
<?php
$log = fopen('app.log', 'a');
stream_set_write_buffer($log, 0); // unbuffered: every fwrite() flushes immediately
fwrite($log, "Request received\n");
fwrite($log, "Response sent\n");
fclose($log);Con il buffering disabilitato, ogni chiamata a fwrite() viene scritta immediatamente invece di attendere che il buffer si riempia, al costo di un accesso al disco più frequente.
Conclusione
La funzione stream_set_write_buffer() in PHP consente di ottimizzare le prestazioni degli script controllando quanti dati uno stream bufferizza prima di scriverli su disco — e di disabilitare completamente il buffering con una dimensione di 0 quando sono necessarie scritture immediate. Poiché il suo valore di ritorno non è affidabile su tutte le piattaforme, abbinarla a fflush() quando è necessario forzare uno svuotamento del buffer. Per approfondire, esplora fopen() per aprire stream, fwrite() per scrivere su di essi, e fclose() per chiuderli correttamente.