Uwaga dla użytkowników mod_fcgid (używaj na własne ryzyko).
Szybkie rozwiązanie
Przyjęta odpowiedź Joeri Sebrechts jest rzeczywiście funkcjonalna. Jeśli jednak używasz mod_fcgid , może się okazać, że to rozwiązanie nie działa samodzielnie. Innymi słowy, gdy wywoływana jest funkcja flush, połączenie z klientem nie zostaje zamknięte.
FcgidOutputBufferSize
Parametr konfiguracji mod_fcgid może być winien. Znalazłem tę wskazówkę w:
- ta odpowiedź Traversa Cartera i
- ten post na blogu Seumasa Mackinnona .
Po przeczytaniu powyższego możesz dojść do wniosku, że szybkim rozwiązaniem byłoby dodanie linii (patrz „Przykład wirtualnego hosta” na końcu):
FcgidOutputBufferSize 0
w pliku konfiguracyjnym Apache (np. httpd.conf), pliku konfiguracyjnym FCGI (np. fcgid.conf) lub w pliku hostów wirtualnych (np. httpd-vhosts.conf).
W (1) powyżej wspomniana jest zmienna o nazwie „OutputBufferSize”. To jest stara nazwa FcgidOutputBufferSize
wspomnianego w (2) (patrz uwagi dotyczące aktualizacji na stronie internetowej Apache dla mod_fcgid ).
Szczegóły i drugie rozwiązanie
Powyższe rozwiązanie wyłącza buforowanie wykonywane przez mod_fcgid albo dla całego serwera, albo dla konkretnego hosta wirtualnego. Może to spowodować spadek wydajności Twojej witryny internetowej. Z drugiej strony może tak nie być, ponieważ PHP samodzielnie wykonuje buforowanie.
Jeśli nie chcesz wyłączać buforowania mod_fcgid , istnieje inne rozwiązanie ... możesz zmusić ten bufor do opróżnienia .
Poniższy kod właśnie to robi, bazując na rozwiązaniu zaproponowanym przez 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');
?>
To, co zasadniczo robi dodana linia kodu, to wypełnienie bufora mod_fcgi , zmuszając go w ten sposób do opróżnienia . Wybrano numer „65537”, ponieważ domyślną wartością FcgidOutputBufferSize
zmiennej jest „65536”, jak wspomniano na stronie internetowej Apache dla odpowiedniej dyrektywy . W związku z tym może być konieczne odpowiednie dostosowanie tej wartości, jeśli w środowisku ustawiono inną wartość.
Moje środowisko
- 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
Przykładowy host wirtualny
<VirtualHost *:80>
DocumentRoot "d:/wamp/www/example"
ServerName example.local
FcgidOutputBufferSize 0
<Directory "d:/wamp/www/example">
Require all granted
</Directory>
</VirtualHost>