使用php ping一个ip地址并回显结果

hmmo2u0o  于 2021-06-24  发布在  Mysql
关注(0)|答案(9)|浏览(448)

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

不管怎样,回声结果总是“死的”。
有人能帮我一下哪里出了问题吗?和/或有没有更好的方法来达到同样的效果?
非常感谢。
更新:修改了代码以包含双引号,但仍然得到相同(不正确)的结果。

kpbpu008

kpbpu0081#

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

oyt4ldly

oyt4ldly2#

我使用这个函数:

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

bgibtngc3#

我已经开发了一个算法来处理异构操作系统,包括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";
nle07wnf

nle07wnf4#

这对我来说很好。。

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

llycmphe5#

我刚刚写了一个非常快速的解决方案,结合以上所有的知识

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

svgewumm6#

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

juzqafwq

juzqafwq7#

注意:下面的解决方案在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");
oyxsuwqo

oyxsuwqo8#

在尝试这些示例之前,一定要检查ping命令的手册页(无论如何都是好的做法)。对于ubuntu16(例如)来说,接受的答案不能作为 -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;
    }
}
goucqfw6

goucqfw69#

这在主机名、反向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);

相关问题