2011-09-05 18 views

risposta

3

In definitiva, dipende. La maggior parte dei meccanismi di hosting PHP che ho usato trasmetteranno la risposta in blocchi, poiché viene ricevuta dallo script, omettendo completamente l'intestazione Content-Length (poiché non è noto in anticipo). È possibile svuotare periodicamente la risposta utilizzando flush() per forzare il server a trasmettere ciò che ha memorizzato nel buffer fino al client.

Quindi, se si stanno facendo cose che richiedono molto tempo e si desidera consentire il rendering della pagina in anticipo, il modo corretto per farlo sarebbe quello di stampare il maggior numero possibile di pagine, chiamare flush(), quindi esegui le tue attività costose. Assicurati di non impiegare più tempo della massima durata dello script PHP dichiarata.


Ok, in modo che spiegazione è certamente un po 'semplificato:

L'intestazione Content-Length può effettivamente essere inviato in alcune circostanze. Ad esempio, se la risposta dello script è inferiore al buffer di PHP per i dati inviati e/o se lo script impiega meno tempo per l'esecuzione, il server saprà esattamente per quanto tempo il contenuto è e può aggiungere l'intestazione della lunghezza.

Inoltre, flush()in realtà non può fare nulla. Questo dipende dalla configurazione del tuo server e da altri fattori. Si noti in particolare questi avvertimenti nella documentazione in materia di comportamento sul lato server:

flush() potrebbe non essere in grado di sostituire il sistema di buffering del server web e non ha alcun effetto su qualsiasi buffer lato client nel browser. Inoltre, non influisce sul meccanismo di buffering dell'output userspace di PHP. Ciò significa che dovrai chiamare sia ob_flush() che flush() per svuotare i buffer di uscita ob se li stai utilizzando.

Diversi server, in particolare su Win32, eseguiranno comunque il buffering dell'output dallo script finché non verrà terminato prima di trasmettere i risultati al browser.

I moduli server per Apache come mod_gzip possono eseguire il buffering proprio per cui flush() non comporta l'invio immediato di dati al client.

In altre parole: test, test, test. Assicurati che il server web non interferisca con il comportamento che stai cercando di raggiungere. Riconfigurare il server Web, se necessario.

+0

Ottima risposta, grazie! –

Problemi correlati