2011-11-06 103 views
13

我有以下功能,目前为止我没有工作。我想ping一个IP地址,然后回显IP是否存活。使用PHP Ping 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") 

回声结果总是“死” - 不管是什么。

有人可以帮我,我哪里出错了吗? 和/或有没有更好的方法来做到这一点的结果相同?

非常感谢。

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

+2

您需要使用双引号为您的来电'shell_exec'否则'$ ip'不会被取代。 – Clive

+0

嗨克莱夫,谢谢 - 我现在用双引号,但仍然得到相同的结果。 – Bernard

回答

15

注意:以下解决方案在Windows上不起作用。在linux上,从控制台执行“哪个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"); 
+0

HI maraspin,已经尝试过使用上面的这个函数,但是这会说甚至999.999.999.999在我尝试时仍然存在 - 是否还有其他问题?你能提出任何疑难解答提示吗? – Bernard

+4

** 1)与大多数UNIX命令行实用程序一样,**'ping'在成功时返回0,而不是1. ** 2)** OP使用Windows,所以'/ bin/ping'将不起作用。 – duskwuff

+1

删除/ bin /并将0更改为1看起来工作 - 谢谢大家。 – Bernard

5

这在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

0

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

永远不要直接在'exec'中使用用户输入。请参阅[此问题](http://stackoverflow.com/q/982904/2008285)以获取消毒用户输入数据的正确方法。 – Linek

+0

咦,真的。在我的代码中,我有一个关于$ _get的sanitize函数,但有点与这个问题没有关系,所以我删除了它。编辑:删除$ _get参数清除。 – ChristianG

0

这对我来说很好。

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

对于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

0

我用这个函数:

<?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

不要尝试其中的一些前检查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; 
    } 
}