<?php
ob_start();
echo 'test';
ob_end_flush();
flush();
sleep(10);
Ich habe versucht, eine Antwort auf die Ajax-Anfrage auszugeben, bevor die Verbindung hergestellt wurde, aber das hat nicht funktioniert. Es werden 10 Sekunden gewartet, bevor die Antwort erfolgreich abgerufen wird. Liegt das Problem beim HTTP-Server, in meinem Fall Apache? Wenn ja, wie kann ich das Problem beheben, sodass die Antwort sofort zurückgegeben wird?
Antwort1
Während flush()
und garantieren sollen, dass die Ausgabe an den Server gesendet wird, habe ich festgestellt, dass PHP manchmal gegenüber bestimmten Softwarekonfigurationen nicht sehr nachsichtig ist ob_end_flush()
.ob_flush()
Besonders unter Windows kann die Einrichtung der Ausgabepufferung mühsam sein. Die einzige Methode, die meiner Erfahrung nach zuverlässig zwischen den Systemen funktioniert, besteht darin, die Ausgabepufferung bei jedem Leeren wie folgt zurückzusetzen:
<?php
obf_start();
for($i=0;$i<70;$i++) {
echo 'printing... ', microtime(true), '<br />';
if($i % 3 == 2) obf_flush();
usleep(300000);
}
function obf_start() {
ob_start();
}
function obf_flush() {
ob_end_flush();
ob_flush();
flush();
obf_start();
}
Ist das eine hässliche Lösung? Ja, das ist sie. Aber bisalle Fehler im Zusammenhang mit der Ausgabepufferungbehoben sind, glaube ich nicht, dass dieser Workaround in absehbarer Zeit aus dem Produktionscode verschwinden wird.
Beachten Sie auch, dass einige Antivirenprogramme (Panda AV und andere) und Proxys alle Daten zurückhalten, bis der Socket geschlossen wird. Sie können nicht garantieren, dass alle Clients ordnungsgemäß gelöschte Daten erhalten.
Antwort2
Der einfachste Weg, um herauszufinden, ob es sich um ein Server- oder Browser-/Bibliotheksproblem handelt, besteht darin, die Anfrage live zu überwachen. In Ihrem Fall sind dies die zwei einfachsten Möglichkeiten:
- Feuerwanze: Diese Firefox-Erweiterung zeigt Ihnen alle Ihre AJAX-Anfragen live an, während sie gesendet werden, und zeigt Ihnen die Antwort, sobald sie vom Browser empfangen wird.
- Verkehrserfassung: Verwenden Sie ein Tool wie Wireshark, um alle gesendeten Anfragen und den vom Server zurückkommenden TCP-Verkehr in Echtzeit anzuzeigen.
Wenn die Daten sofort zurückkommen, aber 10 Sekunden für die Anzeige benötigen, wartet Ihr Browser oder Ihre AJAX-Bibliothek, bis die Verbindung geschlossen ist, bevor die Antwort verarbeitet wird. Wenn es 10 Sekunden dauert, bis Sie etwas zurückbekommen, liegt der Fehler bei Ihrem Server oder PHP-Modul.