| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Сеть > ожидание ответа функции fgets |
| Автор: maykoff 9.1.2008, 19:29 | ||
Код:
/dev/xxxx - это компорт, на котором висит GSM-шлюз. В консоли это выглядит так: AT - запрос OK - ответ Проблема в том, что конца файла у $f, похоже , просто нет. Прочитав всё что можно, на строке $str = fgets($f,8); зависает, ожидая дальнейшего вывода, которого нет, до выхода по условию цикла дело не доходит. Как вариант - задать (сэмулировать) таймаут для функции, в которую поместить чтение из указателя. Но как это сделать - пока не придумал. Идею с отдельным исполняемым скриптом держу про запас. Если у кого какие соображения на этот счёт будут - заранее благодарен . P.S. Прошу не посылать на тему "Виснет скрипт на fgets" - смотрел - там эта проблема не решена, её просто обошли. Мне именно нужно избежать (не допустить) зависания в случае нестандартного (непредвиденного ) ответа шлюза. |
| Автор: sTa1kEr 11.1.2008, 19:03 | ||
Используйте http://ru2.php.net/manual/ru/function.stream-set-timeout.php. Тогда по достижению заданного таймаута fgets() будет "отпускать" скрипт.
|
| Автор: maykoff 12.1.2008, 00:00 |
| Не факт, что сработает, но спасибо, завтра попробую. Спасибо. Нет ли способа проверит состояние открытого потока? В частности - проверить , все ли байты из него вычитаны или количество невычитанных байтов. И ещё - подходит ли для этой задачи fopen ? Или есть более подходящие функции? |
| Автор: FractalizeR 12.1.2008, 17:31 |
| http://www.php.net/stream_get_meta_data Думаю, fopen подходит вполне |
| Автор: maykoff 12.1.2008, 23:12 |
| Проблему обойти удалось путём тщательного анализа ответа шлюза (по ответу можно определить последний байт), но академический интерес остаётся - как избежать зависания скрипта при попытке вычитать несуществующий байт из потока... |
| Автор: FractalizeR 13.1.2008, 01:53 |
| Я же говорю - вызвать stream_get_meta_data и посмотреть, сколько байт находится в буфере непрочитанных. Вы документацию по моей ссылке смотрели? |
| Автор: maykoff 13.1.2008, 12:52 |
| sTa1kEr, поюзал stream_set_timeout($f, 5); - как и ожидалось - не сработало. |
| Автор: maykoff 13.1.2008, 13:52 | ||||||
FractalizeR, смотрел.
Вот код (sleep`ы убрал, чтоб не захламлять):
Вот вывод:
Скрипт работу не закончил - завис. Расшифровка вывода - примерно AT OK f8 - левый какой-то байт, он присутствует в каждом ответе один раз (иногда - на разных позициях, но прогнозируемо) Как видно - Количество байт в сокете не отображено, да и не рекомендуется этот параметр к использованию. Если есть соображения по этому поводу - с удовольствием выслушаю |