2009-08-10 4 views
1

Ich versuche, eine Verbindung zu einem BeanStalkd-Server über ein PHP-Skript herzustellen und Aufträge aus einer vorhandenen Warteschlange zu reservieren. ich die fgets bin mit() Funktion Antworten vom Deamon zu bekommen, um das Skript erwartet zu hängen, wenn nicht ein Job zur Verfügung steht, ist hier ein Beispielcode:PHP fgets() (oder fread()) blockiert nicht

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

Wie Sie sehen, ich versuche zu zwingen Die fgets() -Funktion blockiert und ich setze die max_execution_time auf 0 (keine Begrenzung), aber nach einer Weile (2 Minuten) kehrt das Skript ohne Fehler zurück. Ich habe versucht, den Reserve-Befehl über Telnet auszuführen und es hängt wie erwartet. Ich habe auch versucht, fread() zu verwenden, aber ich bekomme das gleiche Verhalten.

Irgendwelche Vorschläge, wie man es löst?

Antwort

1

Versuchen Sie es mit stream_set_timeout() auch.

+0

Ja, es wäre eine Lösung, aber ich würde gerne wissen, ob es eine komplett blockierungsfreie Möglichkeit gibt, dies zu tun, ohne eine korrekte Wartezeit zu erraten, ohne dass das Skript stirbt. Ich frage mich, ob das eine Art Bug ist. –

0

Haben Sie den Wert in php.ini festgelegt? Haben Sie über phpinfo() den korrekten Wert bestätigt? Wenn Sie es programmgesteuert einstellen, dann wird es nicht funktionieren, vgl. http://us.php.net/manual/en/function.set-time-limit.php:

Diese Funktion hat keine Wirkung, wenn PHP im abgesicherten Modus ausgeführt wird. Es gibt keine andere Problemumgehung, als den abgesicherten Modus zu deaktivieren oder das Zeitlimit in der php.ini zu ändern.

+0

Danke, aber ich denke nicht, dass die Max \ _execution \ _time das eigentliche Problem ist (ich bekomme keinen Fehler), ich habe es trotzdem in der php.ini eingestellt, um sicher zu sein, und Das Skript kehrt immer wieder zurück. Die seltsamste Sache ist, dass, wenn ich versuche, die Ausgabe der Funktion fgets() zu drucken, bekomme ich eine leere Zeichenfolge. –

0

Es ist möglich, dass der Daemon nach 2 Minuten ein Zeilenendezeichen ausgibt. Haben Sie versucht, nach einer leeren Zeichenfolge zu suchen und sie zurückzuschleifen?