Как победить зависание сессии посетителя при выполнении ping средствами PHP?

PHP-скрипт. Apache. Серверная OS - различная (см.ниже)
Выполняет пинг определённого адреса средствами exec

Например:
exec("ping 192.168.0.1 -n 1 -w 350", $output, $status);

Если IP активен - то приходит вполне нормальный и быстрый ответ. Если адрес будет неактивен, то может прийти ответ, что время ожидания истекло (стандартный ответ пинга), а может полностью зависнуть сессия в браузере (в других вкладках этот же ресурс перестаёт работать). Помогает либо - открытие другого браузера, либо перезапуск веб-сервера.

По результатам исследований было выяснено, что вероятная проблема - это "exec" - ей ping, в случае когда IP не отвечает - может не возвращать ответ вовсе. В итоге - exec продолжает ждать ответ и "не отпускает" сессию.

Проблема носит "хаотичный" характер. На некоторых серверах, где работает этот скрипт может проявляться, а на некоторых нет. При этом зачастую ОС сервера роли не играет. Windows, Linux, FreeBSD. Где-то работает, где-то нет.

Пробовали запихнуть скрипт пингования в отдельный аякс-фрейм. Не помогает, т.к. опять же - вешается сессия.

"Специфические" библиотеки для пинга - не подходят, т.к. требуется обеспечить работу на разных серверных ОС

Какие есть мысли - что можно предпринять? Спасибо.
  • Вопрос задан
  • 2974 просмотра
Решения вопроса 2
Melkij
@Melkij
PostgreSQL DBA
Непосредственно про "зависание" сессии - сессии используют блокирующий механизм допуска. Отпустите сессию и она не будет блокировать открытие другие страниц: php.net/manual/en/function.session-write-close.php
Ответ написан
Комментировать
65536
@65536
habrahabr.ru/post/182352 ctrl+f "Дополнение от 2013-06-07"
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@throughtheether
human after all
Выполняет пинг определённого адреса средствами exec
Например:
exec("ping 192.168.0.1 -n 1 -w 350", $output, $status);
Команда для разных ОС одинаковая? Насколько мне известно, единичные значения параметра -w в windows и linux различны (миллисекунда и секунда соответственно).
Какие есть мысли - что можно предпринять?
Если команда одна и та же для разных ОС, то значение таймаута для linux-варианта предлагаю скорректировать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы