【问题标题】:PHP pinging, even 1 request timeoutPHP ping,甚至 1 个请求超时
【发布时间】:2013-02-20 14:52:26
【问题描述】:

我一直在使用下面的脚本,但是,我希望它 ping 3-4 次,并且在这 3-4 次内,如果它甚至有一个请求超时,我希望 php 返回失败。

这是我正在使用的脚本:

 <?php

function pingAddressHasNeverFailed($tries) {
    for ($i = 0; $i < $tries; $i++) {
        $pingresult = shell_exec("ping -c 1 www.google.com", $outcome, $status);
        if ($status != 0)
            return false;
    }
    return true;
}

if (pingAddressHasNeverFailed(3)) {
    echo "uoc gi";
}
?>

如果可以的话,请帮忙,非常感谢您!

【问题讨论】:

  • 这会专门在 Windows 上使用吗?
  • 不,我在 linux/centos 上使用 on
  • 那你为什么用-n 3?不应该是-c 3吗?
  • 我不知道,这是我从网上拿的脚本,难怪它不起作用:)

标签: php ping


【解决方案1】:

如果任何 ping 失败(在一组中),输出中将不会有 0%(即 0% 丢包),这对于 Linux 和 Windows 是相同的:

function ping($host, $times = 3)
{
  exec("/bin/ping -c 3 $host", $out, $status);

  return $status === 0 && false !== strpos(join('', $out), '0%');
}

if (ping('www.google.com)) {
  echo "yay\n";
} else {
  echo "oh dear\n";
}

您可能需要调整 ping 参数以适应您的环境并确保主机名已清理。

【讨论】:

    【解决方案2】:

    在这种情况下,您需要执行命令 n(n 是尝试次数)次。例如:

    function pingAddressHasNeverFailed($tries) {
        $outcome = array();
        $status = -1;
    
        for ($i = 0; $i < $tries; $i++) {
            $pingresult = exec("/bin/ping -n 1 www.google.com", $outcome, $status);
            if ($status != 0)
                return false;
        }
        return true;
    }
    

    用法:

    if (pingAddressHasNeverFailed(3)) {
        //do something useful
    }
    

    【讨论】:

    • 我已经尝试过了,得到:PHP 注意:未定义变量:结果在
    • @thevoipman 我已经复制并粘贴了您的代码。忘记初始化我的局部变量。编辑代码。
    • 正如杰克所说,你想在 Linux 上使用 -c 而不是 -n。
    • 我不得不使用:$pingresult = shell_exec("ping -c 1 www.google.com", $outcome, $status); // 然后它显示: PHP 警告:shell_exec() 只需要 1 个参数,给定 3 个
    • 我认为这只是以 root 身份运行时显示的一部分,但其他一切正常!谢谢
    猜你喜欢
    • 2019-08-09
    • 2015-10-31
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    相关资源
    最近更新 更多