Ping exec на Linux висит скрипт

У меня есть простая настройка PHP-скрипта для проверки состояния моих серверов. Он использует стандартную команду ping, запускаемую через exec ().

  • В Windows скрипт отлично работает как при подключенном сервере, так и при
    когда вниз.
  • В Linux скрипт работает, когда сервер подключен к сети, но зависает, когда
    сервер не работает Тайм-аут, похоже, не влияет на последнее.

Пинг с той же командой через консоль работает нормально и время ожидания корректно.


В чем причина, и как это можно исправить?

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
$exec_string = 'ping -n 1 -i 255 -w 2 ' . $host;
} else {
$exec_string = 'ping -n -c 1 -t 255 -w 2 ' . $host;
}
exec($exec_string, $output, $return);

2

Решение

Я бы не стал пинговать напрямую, используя exec(), Я использую этот скрипт, нашел здесь, Вы также можете настроить порт и время ожидания:

function ping($host, $port = 80, $timeout = 6) {
$fsock = fsockopen($host, $port, $errno, $errstr, $timeout);
if (!$fsock) {
return false;
} else {
return true;
}
}

$host = 'www.example.com';

if(ping($host)) {
echo "HOST UP";
} else {
echo "HOST DOWN";
}
2

Другие решения

Я не уверен, почему, но переключение с suPHP на fastCGI (оба с включенным suEXEC), похоже, решило проблему, и пинг правильно истек, как и ожидалось.

Если у кого-то есть объяснение этому, я хотел бы знать, в формате комментариев или ответов.

1

По вопросам рекламы [email protected]