使用PHP ping IP地址并回显结果

时间:2011-11-06 22:10:42

标签: php ping shell-exec

我有以下功能,到目前为止我没有工作。我想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")

回声结果总是“死” - 无论如何。

有人可以在我出错的地方帮助我吗? 和/或者有更好的方法来做同样的结果吗?

非常感谢。

更新:修改了代码以包含双引号,但仍然得到相同(不正确)的结果。

9 个答案:

答案 0 :(得分:16)

注意:下面的解决方案在Windows上不起作用。在linux上执行来自控制台的“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");

答案 1 :(得分:7)

这在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 site and return result in PHP感谢@ karim79

得到了这个

答案 2 :(得分:2)

我已经开发出适用于异构操作系统的算法,包括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";

答案 3 :(得分:1)

这对我来说很好..

$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";
}

答案 4 :(得分:0)

对于Windows使用此类

grunt.registerTask('wait', 'Wait for a set amount of time.', function() {

    delay = 1;

    var d = delay ? delay + ' second' + (delay === '1' ? '' : 's') : 'forever';
    grunt.log.write('Waiting ' + d + '...');
    // Make this task asynchronous. Grunt will not continue processing
    // subsequent tasks until done() is called.
    var done = this.async();
    // If a delay was specified, call done() after that many seconds.
    if (delay) { setTimeout(done, delay * 1000); }

});

axios

答案 5 :(得分:0)

在尝试其中一些示例之前,请检查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;
    }
}

答案 6 :(得分:0)

我只是通过结合以上所有知识获得了一个非常快速的解决方案

    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;
        }
    }

答案 7 :(得分:-1)

这适用于主机名,反向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);

答案 8 :(得分:-1)

我使用这个功能:

dataInit."mapping[propertyInfo.Name]" = mappingContact[propertyInfo.Name].Count == 1 ? (Adress)mappingContact[propertyInfo.Name].First().CodeAdresse : null;