Hinweis für mod_fcgid-Benutzer (bitte auf eigenes Risiko verwenden).
Schnelle Lösung
Die akzeptierte Antwort von Joeri Sebrechts ist in der Tat funktional. Wenn Sie jedoch mod_fcgid verwenden, stellen Sie möglicherweise fest, dass diese Lösung nicht alleine funktioniert. Mit anderen Worten, wenn die Flush- Funktion aufgerufen wird, wird die Verbindung zum Client nicht geschlossen.
Der FcgidOutputBufferSize
Konfigurationsparameter von mod_fcgid kann schuld sein. Ich habe diesen Tipp gefunden in:
- diese Antwort von Travers Carter und
- Dieser Blog-Beitrag von Seumas Mackinnon .
Nachdem Sie das Obige gelesen haben, können Sie zu dem Schluss kommen, dass eine schnelle Lösung darin besteht, die Zeile hinzuzufügen (siehe "Beispiel für einen virtuellen Host" am Ende):
FcgidOutputBufferSize 0
entweder in Ihrer Apache-Konfigurationsdatei (z. B. httpd.conf), Ihrer FCGI-Konfigurationsdatei (z. B. fcgid.conf) oder in Ihrer virtuellen Hosts-Datei (z. B. httpd-vhosts.conf).
In (1) oben wird eine Variable mit dem Namen "OutputBufferSize" erwähnt. Dies ist der alte Name des FcgidOutputBufferSize
in (2) genannten (siehe die Upgrade-Hinweise auf der Apache-Webseite für mod_fcgid ).
Details & eine zweite Lösung
Die obige Lösung deaktiviert die von mod_fcgid durchgeführte Pufferung entweder für den gesamten Server oder für einen bestimmten virtuellen Host. Dies kann zu einer Leistungsminderung für Ihre Website führen. Auf der anderen Seite ist dies möglicherweise nicht der Fall, da PHP die Pufferung selbst durchführt.
Falls Sie die Pufferung von mod_fcgid nicht deaktivieren möchten , gibt es eine andere Lösung ... Sie können diesen Puffer zum Leeren zwingen .
Der folgende Code macht genau das, indem er auf der von Joeri Sebrechts vorgeschlagenen Lösung aufbaut:
<?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');
?>
Die hinzugefügte Codezeile füllt im Wesentlichen den Puffer von mod_fcgi und zwingt ihn zum Leeren . Die Nummer "65537" wurde gewählt, da der Standardwert der FcgidOutputBufferSize
Variablen "65536" ist, wie auf der Apache-Webseite für die entsprechende Anweisung angegeben . Daher müssen Sie diesen Wert möglicherweise entsprechend anpassen, wenn in Ihrer Umgebung ein anderer Wert festgelegt ist.
Meine Umgebung
- WampServer 2.5
- Apache 2.4.9
- PHP 5.5.19 VC11, x86, nicht threadsicher
- mod_fcgid / 2.3.9
- Windows 7 Professional x64
Beispiel für einen virtuellen Host
<VirtualHost *:80>
DocumentRoot "d:/wamp/www/example"
ServerName example.local
FcgidOutputBufferSize 0
<Directory "d:/wamp/www/example">
Require all granted
</Directory>
</VirtualHost>