Nota per gli utenti mod_fcgid (per favore, usa a tuo rischio).
Soluzione rapida
La risposta accettata di Joeri Sebrechts è davvero funzionale. Tuttavia, se usi mod_fcgid potresti scoprire che questa soluzione non funziona da sola. In altre parole, quando viene chiamata la funzione flush , la connessione al client non viene chiusa.
La colpa potrebbe essere FcgidOutputBufferSize
del parametro di configurazione di mod_fcgid . Ho trovato questo suggerimento in:
- questa risposta di Travers Carter e
- questo post sul blog di Seumas Mackinnon .
Dopo aver letto quanto sopra, potresti giungere alla conclusione che una soluzione rapida sarebbe aggiungere la riga (vedi "Esempio di host virtuale" alla fine):
FcgidOutputBufferSize 0
nel file di configurazione di Apache (ad esempio, httpd.conf), nel file di configurazione FCGI (ad esempio fcgid.conf) o nel file degli host virtuali (ad esempio, httpd-vhosts.conf).
In (1) sopra, viene menzionata una variabile denominata "OutputBufferSize". Questo è il vecchio nome del FcgidOutputBufferSize
menzionato in (2) (vedere le note di aggiornamento nella pagina web di Apache per mod_fcgid ).
Dettagli e una seconda soluzione
La soluzione precedente disabilita il buffering eseguito da mod_fcgid per l'intero server o per uno specifico host virtuale. Ciò potrebbe comportare una riduzione delle prestazioni del tuo sito web. D'altra parte, questo potrebbe non essere il caso poiché PHP esegue il buffering da solo.
Nel caso in cui non desideri disabilitare il buffering di mod_fcgid , c'è un'altra soluzione ... puoi forzare lo scaricamento di questo buffer .
Il codice seguente fa proprio questo basandosi sulla soluzione proposta da Joeri Sebrechts:
<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // just to be safe
ob_start();
echo('Text the user will see');
echo(str_repeat(' ', 65537)); // [+] Line added: Fill up mod_fcgi's buffer.
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); // Strange behaviour, will not work
flush(); // Unless both are called !
// Do processing here
sleep(30);
echo('Text user will never see');
?>
Ciò che essenzialmente fa la riga di codice aggiunta è riempire il buffer di mod_fcgi , costringendolo così a svuotarlo . Il numero "65537" è stato scelto perché il valore predefinito della FcgidOutputBufferSize
variabile è "65536", come menzionato nella pagina web di Apache per la direttiva corrispondente . Pertanto, potrebbe essere necessario regolare questo valore di conseguenza se è impostato un altro valore nel proprio ambiente.
Il mio ambiente
- WampServer 2.5
- Apache 2.4.9
- PHP 5.5.19 VC11, x86, non thread-safe
- mod_fcgid / 2.3.9
- Windows 7 Professional x64
Host virtuale di esempio
<VirtualHost *:80>
DocumentRoot "d:/wamp/www/example"
ServerName example.local
FcgidOutputBufferSize 0
<Directory "d:/wamp/www/example">
Require all granted
</Directory>
</VirtualHost>