working - print php flush




Buffer PHP ob_flush() vs. flush() (3)

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

Il riferimento ob_flush() dice:

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

Il riferimento flush() dice:

Svuota i buffer di scrittura di PHP e qualunque sia il backend utilizzato da PHP (CGI, un server Web, ecc.).

Tuttavia, continua a dire:

[potrebbe] non essere in grado di sovrascrivere lo schema di buffering del tuo server web ...

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


Immagino che questo sia in relazione alla tua domanda precedente . 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. flush solo si limiterà a commettere qualsiasi dato di output è ancora sul server. Con ob_start e le sue controparti ob_flush , ob_end_clean e ob_end_flush , qualunque cosa sia in attesa di essere compressa (guarda flush e ob_flush come riferimento a diversi bucket - ob invia i dati per flush , flush invia i dati al browser - potrebbe non essere accurato ma questa è l'idea) sarà confezionato e inviato al cliente.


ob_flush() è un flush 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 famiglia di funzioni ob_ crea pile di buffer, quindi scrivere ciecamente ob_flush() dappertutto darà davvero "strani risultati" se il codice è stato scritto per sfruttare questo impilamento.

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.


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) output buffer. Questo dipende dal back-end. Ma di solito FastCGI ha un buffer socket da solo. Perciò flush() deve essere invocato per inviare il contenuto corrente al server web.

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

Ad ogni modo, usa entrambi.







output-buffering