![]() |
Модераторы: Aliance, skyboy, MoLeX, ksnk |
![]() ![]() ![]() |
|
maykoff |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 19.8.2006 Репутация: нет Всего: нет |
Код:
/dev/xxxx - это компорт, на котором висит GSM-шлюз. В консоли это выглядит так: AT - запрос OK - ответ Проблема в том, что конца файла у $f, похоже , просто нет. Прочитав всё что можно, на строке $str = fgets($f,8); зависает, ожидая дальнейшего вывода, которого нет, до выхода по условию цикла дело не доходит. Как вариант - задать (сэмулировать) таймаут для функции, в которую поместить чтение из указателя. Но как это сделать - пока не придумал. Идею с отдельным исполняемым скриптом держу про запас. Если у кого какие соображения на этот счёт будут - заранее благодарен . P.S. Прошу не посылать на тему "Виснет скрипт на fgets" - смотрел - там эта проблема не решена, её просто обошли. Мне именно нужно избежать (не допустить) зависания в случае нестандартного (непредвиденного ) ответа шлюза. Это сообщение отредактировал(а) maykoff - 9.1.2008, 19:32 |
|||
|
||||
sTa1kEr |
|
|||
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: нет Всего: 146 |
Используйте stream_set_timeout(). Тогда по достижению заданного таймаута fgets() будет "отпускать" скрипт.
|
|||
|
||||
maykoff |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 19.8.2006 Репутация: нет Всего: нет |
Не факт, что сработает, но спасибо, завтра попробую. Спасибо.
Нет ли способа проверит состояние открытого потока? В частности - проверить , все ли байты из него вычитаны или количество невычитанных байтов. И ещё - подходит ли для этой задачи fopen ? Или есть более подходящие функции? Это сообщение отредактировал(а) maykoff - 12.1.2008, 00:04 |
|||
|
||||
FractalizeR |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 273 Регистрация: 27.12.2007 Где: Россия/Москва Репутация: нет Всего: 4 |
www.php.net/stream_get_meta_data
Думаю, fopen подходит вполне Это сообщение отредактировал(а) FractalizeR - 12.1.2008, 17:32 -------------------- Чтобы поблагодарить или наоборот поругать участника форума лучше пользоваться значками "+" и "-", изменяющими репутацию. Они находятся слева от поста под именем пользователя. |
|||
|
||||
maykoff |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 19.8.2006 Репутация: нет Всего: нет |
Проблему обойти удалось путём тщательного анализа ответа шлюза (по ответу можно определить последний байт), но академический интерес остаётся - как избежать зависания скрипта при попытке вычитать несуществующий байт из потока...
Это сообщение отредактировал(а) maykoff - 12.1.2008, 23:14 |
|||
|
||||
FractalizeR |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 273 Регистрация: 27.12.2007 Где: Россия/Москва Репутация: нет Всего: 4 |
Я же говорю - вызвать stream_get_meta_data и посмотреть, сколько байт находится в буфере непрочитанных. Вы документацию по моей ссылке смотрели?
Это сообщение отредактировал(а) FractalizeR - 13.1.2008, 01:53 -------------------- Чтобы поблагодарить или наоборот поругать участника форума лучше пользоваться значками "+" и "-", изменяющими репутацию. Они находятся слева от поста под именем пользователя. |
|||
|
||||
maykoff |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 19.8.2006 Репутация: нет Всего: нет |
sTa1kEr, поюзал stream_set_timeout($f, 5); - как и ожидалось - не сработало.
|
|||
|
||||
maykoff |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 19.8.2006 Репутация: нет Всего: нет |
FractalizeR, смотрел.
Вот код (sleep`ы убрал, чтоб не захламлять):
Вот вывод:
Скрипт работу не закончил - завис. Расшифровка вывода - примерно AT OK f8 - левый какой-то байт, он присутствует в каждом ответе один раз (иногда - на разных позициях, но прогнозируемо) Как видно - Количество байт в сокете не отображено, да и не рекомендуется этот параметр к использованию. Если есть соображения по этому поводу - с удовольствием выслушаю ![]() |
||||||
|
|||||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Сеть | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |