[英]Pinging an IP address using PHP and echoing the result
我有以下功能,到目前为止我还无法使用。 我想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上,从控制台执行“ 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.stackoverflow.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;
}
}
这对我来说很好
$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";
}
对于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);
在尝试其中一些示例之前,请务必检查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;
}
}
我使用这个功能:
<?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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.