PHP-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);
Author: techjwalker, 2016-05-27

2 answers

Я бы избегал пинга напрямую, используя 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
Author: Napolux, 2016-05-27 06:45:38

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

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

 1
Author: techjwalker, 2016-05-27 07:58:37