У меня есть следующая функция, с которой я пока не работаю. Я хотел бы выполнить 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.'; }
Это отлично работает с именем хоста, обратным 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; } }