Пропинг IP-адреса с использованием PHP и отображение результата - PullRequest
17 голосов
/ 07 ноября 2011

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

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

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

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

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

Ответы [ 9 ]

16 голосов
/ 07 ноября 2011

ПРИМЕЧАНИЕ. Решение, приведенное ниже, не работает в 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");
7 голосов
/ 11 мая 2012

Это также не работает для меня в 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

5 голосов
/ 29 марта 2018

Я разработал алгоритм для работы с разнородными ОС, как 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.stackoverflow.com

    if ((new CheckDevice())->ping($ip_addr))
        echo "The device exists";
    else 
        echo "The device is not connected";
1 голос
/ 16 июня 2017

Для 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

1 голос
/ 19 апреля 2017

это прекрасно работает для меня ..

<code>$host="127.0.0.1";
$output=shell_exec('ping -n 1 '.$host);

echo "<pre>$output
"; // для просмотра результата пинга, если не нужно, просто удалите его if (strpos ($ output, 'out')! == false) {echo "Dead";} elseif (strpos ($ output, 'expired')! == false) {echo "Ошибка сети";} elseif (strpos ($ output, 'data')! == false) {echo "Alive";} else {echo" Неизвестная ошибка ";}
0 голосов
/ 20 июня 2019

Я только что написал очень быстрое решение, объединив все знания выше

    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;
        }
    }
0 голосов
/ 20 ноября 2017

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

По запросу OP потенциальная альтернативная функция будет выглядеть следующим образом:

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;
    }
}
0 голосов
/ 19 сентября 2017

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

<?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;
}
0 голосов
/ 22 марта 2017

Отлично работает с именем хоста, обратным 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);
...