2 Stimmen

PHP fgets() (oder fread()) blockiert nicht

Ich versuche, über ein PHP-Skript eine Verbindung zu einem Beanstalkd-Server herzustellen und Aufträge aus einer bestehenden Warteschlange zu reservieren. Ich verwende die Funktion fgets(), um Antworten vom Deamon zu erhalten, und erwarte, dass das Skript hängen bleibt, wenn kein Auftrag verfügbar ist, hier ist ein Beispielcode:

set_time_limit(0);
$connection = fsockopen('localhost', 11300);
fwrite($connection, "reserve\r\n");
stream_set_blocking($connection, TRUE);
fgets($connection);

Wie Sie sehen können, versuche ich, die Funktion fgets() zum Blockieren zu zwingen, und ich setze die max_execution_time auf 0 (d.h. kein Limit), aber nach einer Weile (2 Minuten) kehrt das Skript ohne Fehler zurück. Ich habe versucht, den Reserve-Befehl über Telnet auszuführen, und er bleibt wie erwartet hängen. Ich habe auch versucht, fread() zu verwenden, aber ich erhalte das gleiche Verhalten.

Haben Sie einen Vorschlag, wie man das Problem lösen kann?

1voto

Greg Punkte 306033

Versuchen Sie es mit stream_set_timeout() auch.

0voto

Residuum Punkte 11604

Haben Sie den Wert in der php.ini gesetzt? Haben Sie den korrekten Wert mit phpinfo() bestätigt? Wenn Sie ihn programmatisch setzen, wird er nicht funktionieren, vgl. http://us.php.net/manual/en/function.set-time-limit.php :

Diese Funktion hat keine Auswirkungen, wenn PHP im abgesicherten Modus läuft. Es gibt keine andere Möglichkeit, als den sicheren Modus zu deaktivieren oder das Zeitlimit in der php.ini zu ändern.

0voto

user288849 Punkte 1

Es ist möglich, dass der Daemon nach 2 Minuten ein Zeilenendezeichen ausgibt. Haben Sie versucht, nach einer leeren Zeichenkette zu suchen und diese in einer Schleife zurückzugeben?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X