Pinging IP-адрес с использованием PHP и повторение результата

У меня есть следующая функция, с которой я пока не работаю. Я хотел бы выполнить ping IP-адрес, а затем повторить, жив ли IP-адрес.

function pingAddress($ip){ $pingresult = shell_exec("start /b ping $ip -n 1"); $dead = "Request timed out."; $deadoralive = strpos($dead, $pingresult); if ($deadoralive == false){ echo "The IP address, $ip, is dead"; } else { echo "The IP address, $ip, is alive"; } } 

Когда я вызываю эту функцию, используя пример:

 pingAddress("127.0.0.1") 

Результат эха всегда «мертв» – несмотря ни на что.

Может кто-нибудь, пожалуйста, помогите мне, где я ошибаюсь? И / ИЛИ есть лучший способ сделать это с тем же результатом?

Большое спасибо.

Обновление: изменил код, чтобы включить двойные кавычки, но все равно получая одинаковые (неверные) результаты.

ПРИМЕЧАНИЕ. Решение ниже не работает в Windows. В linux exec команда «ping» из консоли и задайте путь команды (предлагаемого вызова exec) соответственно

Я думаю, что вы хотите проверить статус выхода команды, тогда как shell_exec дает вам полный выход (может быть, по какой-то причине может быть вызвано изменение вывода из командной строки в версию). Более того, переменная $ ip не интерпретируется в одинарных кавычках. Вам придется использовать двойные "". Это может быть единственное, что вам нужно исправить, чтобы заставить его работать.

Но я думаю, что следующий код может быть более «портативным». ИМХО, на самом деле лучше поймать статус выхода, а не пытаться проанализировать строку результата. IMHO также лучше указать полный путь к команде ping.

 <?php function pingAddress($ip) { $pingresult = exec("/bin/ping -n 3 $ip", $outcome, $status); if (0 == $status) { $status = "alive"; } else { $status = "dead"; } echo "The IP address, $ip, is ".$status; } pingAddress("127.0.0.1"); 

Это также не помогло мне в WordPress. Я также пробовал -t и -n и другие способы, но не работал. Я использовал,

 function pingAddress($ip) { $pingresult = exec("/bin/ping -c2 -w2 $ip", $outcome, $status); if ($status==0) { $status = "alive"; } else { $status = "dead"; } $message .= '<div id="dialog-block-left">'; $message .= '<div id="ip-status">The IP address, '.$ip.', is '.$status.'</div><div style="clear:both"></div>'; return $message; } // Some IP Address pingAddress("192.168.1.1"); 

Наконец, это отлично сработало. Я упомянул это по http://www.phpscriptsdaily.com/php/php-ping/ Надеюсь, это поможет

Ну, я хочу изменить это, поскольку он отлично работает на моем локальном хосте, но не на моем реальном сервере. Для живого сервера у меня есть еще одна вещь, которая теперь работает как для местных, так и для живых.

 $fp = fSockOpen($ip,80,$errno,$errstr,1); if($fp) { $status=0; fclose($fp); } else { $status=1; } 

Затем я показываю, что сервер установлен на 0 и вниз на 1.

Это отлично работает для меня. Я получил это от сайта Ping и вернул результат в PHP Спасибо @ karim79

Для Windows Используйте этот класс

 $host = 'www.example.com'; $ping = new Ping($host); $latency = $ping->ping(); if ($latency !== false) { print 'Latency is ' . $latency . ' ms'; } else { print 'Host could not be reached.'; } 

https://github.com/geerlingguy/Ping

Это отлично работает с именем хоста, обратным IP (для внутренних сетей) и IP.

 function pingAddress($ip) { $ping = exec("ping -n 2 $ip", $output, $status); if (strpos($output[2], 'unreachable') !== FALSE) { return '<span style="color:#f00;">OFFLINE</span>'; } else { return '<span style="color:green;">ONLINE</span>'; } } echo pingAddress($ip); 

это отлично работает для меня ..

 $host="127.0.0.1"; $output=shell_exec('ping -n 1 '.$host); echo "<pre>$output</pre>"; //for viewing the ping result, if not need it just remove it if (strpos($output, 'out') !== false) { echo "Dead"; } elseif(strpos($output, 'expired') !== false) { echo "Network Error"; } elseif(strpos($output, 'data') !== false) { echo "Alive"; } else { echo "Unknown Error"; } 

Я использую эту функцию:

 <?php function is_ping_address($ip) { exec('ping -c1 -w1 '.$ip, $outcome, $status); preg_match('/([0-9]+)% packet loss/', $outcome[3], $arr); return ( $arr[1] == 100 ) ? false : true; } 

Проверяйте страницы руководства вашей команды ping, прежде чем попробовать некоторые из этих примеров (всегда хорошая практика). Например, для Ubuntu 16 принятый ответ не работает, поскольку сбой -n 3 (это больше не количество пакетов, -n означает не преобразование IP-адреса в имя хоста).

По просьбе ОП потенциальная альтернативная функция будет следующей:

 function checkPing($ip){ $ping = trim(`which ping`); $ll = exec($ping . '-n -c2 ' . $ip, $output, $retVar); if($retVar == 0){ echo "The IP address, $ip, is alive"; return true; } else { echo "The IP address, $ip, is dead"; return false; } }