PHP fgets () (или fread ()) не блокирует - PullRequest
2 голосов
/ 10 августа 2009

Я пытаюсь подключиться к серверу beanstalkd через скрипт PHP и зарезервировать задания из существующей очереди. Я использую функцию fgets () для получения ответов от демона, ожидая, что скрипт будет зависать, если работа недоступна, вот пример кода:

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

Как вы можете видеть, я пытаюсь заставить функцию fgets () блокировать, и я устанавливаю max_execution_time на 0 (что означает отсутствие ограничений), но через некоторое время (2 минуты) скрипт возвращается без ошибок. Я попытался запустить резервную команду через telnet, и она зависла как исключено. Я также пытался использовать fread (), но получаю тот же бэвиур.

Есть предложения, как ее решить?

Ответы [ 3 ]

1 голос
/ 10 августа 2009

Попробуйте также использовать stream_set_timeout().

0 голосов
/ 08 марта 2010

Возможно, демон выводит символ конца строки через 2 минуты. Вы пытались проверить пустую строку и вернуть ее обратно?

0 голосов
/ 10 августа 2009

Вы установили значение в php.ini? Вы подтвердили правильное значение с помощью phpinfo ()? Если вы установите его программно, то у вас это не получится, ср. http://us.php.net/manual/en/function.set-time-limit.php:

Эта функция не работает, когда PHP работает в безопасном режиме. Обходного пути нет, кроме как отключить безопасный режим или изменить ограничение времени в php.ini.

...