Проверка связи с IP-адресом с использованием PHP и отображение результата
У меня есть следующая функция, которую я не работаю до сих пор. Я хотел бы пропинговать 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")
Результат эха всегда "мертвый" - несмотря ни на что.
Может ли кто-нибудь помочь мне, где я иду не так? И / ИЛИ есть ли лучший способ сделать это с тем же результатом?
Большое спасибо.
Обновление: измените код, включив в него двойные кавычки, но получая те же (неправильные) результаты.
11 ответов
ПРИМЕЧАНИЕ. Решение ниже не работает в Windows. В linux exec введите команду "which ping" из консоли и соответственно установите путь к команде (из предложенного вызова exec)
Я думаю, что вы хотите проверить состояние завершения команды, тогда как shell_exec дает вам полный вывод (может быть опасно, если вывод команды изменится с версии команды на версию. По какой-то причине). Более того, ваша переменная $ip не интерпретируется в одинарных кавычках. Вы должны использовать двойные "". Это может быть единственное, что вам нужно исправить, чтобы заставить его работать.
Но я думаю, что следующий код может быть более "переносимым". ИМХО, на самом деле лучше поймать состояние выхода, чем пытаться разобрать строку результата. ИМХО также лучше указать полный путь к команде 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, так и Linux.
Реализуйте следующий класс:
<?php
class CheckDevice {
public function myOS(){
if (strtoupper(substr(PHP_OS, 0, 3)) === (chr(87).chr(73).chr(78)))
return true;
return false;
}
public function ping($ip_addr){
if ($this->myOS()){
if (!exec("ping -n 1 -w 1 ".$ip_addr." 2>NUL > NUL && (echo 0) || (echo 1)"))
return true;
} else {
if (!exec("ping -q -c1 ".$ip_addr." >/dev/null 2>&1 ; echo $?"))
return true;
}
return false;
}
}
$ip_addr = "151.101.193.69"; #DNS: www.stackru.com
if ((new CheckDevice())->ping($ip_addr))
echo "The device exists";
else
echo "The device is not connected";
Я просто написал очень быстрое решение, объединив все полученные выше знания
function pinger($address){
if(strtolower(PHP_OS)=='winnt'){
$command = "ping -n 1 $address";
exec($command, $output, $status);
}else{
$command = "ping -c 1 $address";
exec($command, $output, $status);
}
if($status === 0){
return true;
}else{
return false;
}
}
Для 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.';
}
Это прекрасно работает для меня..
$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";
}
Основываясь на отличном ответе @tiamiyu-saheed-oluwatosin, я написал эту небольшую функцию в сокращенном виде if/else (тройном), работающую как в Windows, так и в Linux, чтобы проверить, работает ли второй PHP-сервер в моей локальной сети.
function running($ip) {
exec("ping -{strtolower(PHP_OS)=='winnt'?'n':'c'} 1 $ip", $out, $res);
return ($res === 0 ? true : false);
}
Использовать :
if(running('192.168.1.20') {
// execute some code...
}
Проверьте справочные страницы вашей команды 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;
}
}
Это работа со мной:
<?php
class CheckDevice {
public function myOS(){
if (strtoupper(substr(PHP_OS, 0, 3)) === (chr(87).chr(73).chr(78)))
return true;
return false;
}
public function ping($ip_addr){
if ($this->myOS()){
if (!exec("ping -n 1 -w 1 ".$ip_addr." 2>NUL > NUL && (echo 0) || (echo 1)"))return true;
} else {
if (!exec("ping -q -c1 ".$ip_addr." >/dev/null 2>&1 ; echo $?"))
return true;
}return false;
}
}
$ip_addr = "192.168.1.1";
if ((new CheckDevice())->ping($ip_addr))
echo "The device exists";
else
echo "The device is not connected";
Это прекрасно работает с именем хоста, обратным 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);
Я использую эту функцию:
<?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;
}