2010-11-16 19 views
61

Qual è la differenza tra ob_flush() e flush() e perché devo chiamare entrambi?Buffer PHP ob_flush() vs. flush()

Il ob_flush() reference dice:

Questa funzione invierà il contenuto del buffer di uscita (se presente).

Il flush() reference dice:

svuota il buffer di scrittura di PHP e qualunque backend PHP sta usando (CGI, un server web, ecc).

Tuttavia, continua a dire:

[it] potrebbe non essere in grado di sostituire il sistema di buffering del server web ...

Quindi, mi sembra che ho potuto basta usare ob_flush() tutto il tempo. Tuttavia, ottengo risultati strani quando lo faccio. Qualcuno potrebbe spiegare in termini semplici cosa sta succedendo qui?

risposta

62

ob_flush invia un buffer avviato dall'applicazione. Ci possono essere più nidificati ob_start() in qualsiasi script PHP. ob_flush passa il contenuto corrente al livello superiore.

PHP stesso potrebbe (a propria discrezione) l'uscita del buffer. Questo dipende dal back-end. Ma di solito lo FastCGI ha un buffer di socket da solo. Pertanto, è necessario invocare anche flush() per inviare il contenuto corrente al server Web.

E ora il server Web potrebbe implementare un altro schema di buffer (mod_deflate o filtro dei contenuti), su cui non si ha alcuna influenza. Ma questo è raramente, in quanto deve essere configurato in modo specifico.

In ogni caso, utilizzare entrambi.

+6

Utilizzare ob_flush e flush e usarli in questo ordine. – Robino

+12

L'importante dettaglio mancante da questa risposta è l'opzione di configurazione ['output_buffering'] (http://www.php.net/manual/en/outcontrol.configuration.php#ini.output-buffering), il cui valore predefinito in produzione le versioni di php.ini sono 4096. Ciò significa che quando inizia uno script PHP, i primi 4096 byte di output vengono bufferizzati (in un buffer flusibile con 'ob_flush()'). Questo è il motivo per cui è necessario usare 'ob_flush()' così come 'flush()'. Disabilitare 'output_buffering' via php.ini o chiamare' ob_end_clean() 'o' ob_end_flush() 'all'inizio dello script rimuove questa necessità. –

26

ob_flush vampate buffer di uscita si creati con una funzione come ob_start

flush vampate buffered output dello script PHP stesso al chiamante

10

Credo che questo sia in relazione al vostro previous question. Il vantaggio significativo dell'utilizzo del buffer di output è quando viene utilizzato insieme alla compressione dei dati. Se non stai usando ob_gzhandler, c'è poco da guadagnare. Solo flush eseguirà il commit dei dati di output sul server. Con ob_start e le sue controparti ob_flush, ob_end_clean e ob_end_flush, tutto ciò che è in attesa di essere compressi (vedi flush e ob_flush come riferito a diversi secchi - ob invia i dati al flush, flush invia i dati al browser - non può essere precisa, ma che è l'idea) sarà confezionato e inviato al cliente.

+0

Grazie, l'analogia con il secchio è un buon esempio. – Ben

18

ob_flush() è uno svuotamento di alto livello. Elimina i buffer di alto livello e inserisce tutto il contenuto nei buffer interni di basso livello pronti per l'invio.

  • Si noti che la ob_ famiglia di funzioni creare pile di buffer, in modo da scrivere ciecamente ob_flush() ovunque è infatti sta per dare "strani risultati" se il codice è stato scritto per approfittare di questa sovrapposizione.

flush() è uno svuotamento di basso livello che istruisce PHP a svuotare i suoi buffer di dati interni di basso livello.

Al di sotto di questo, ci saranno buffer socket-layer; al di sotto di questo, ci sono buffer a livello di rete. E, al livello più basso, la coda di elettroni che scende dal cavo dati.