【问题标题】:Using php to ping a website使用 php ping 一个网站
【发布时间】:2010-11-12 10:25:19
【问题描述】:

我想创建一个 php 脚本,它将 ping 一个域并列出响应时间以及请求的总大小。

这将用于监控网站网络。我用curl 试过了,这是我目前的代码:

function curlTest2($url) {
    clearstatcache();

    $return = '';

    if(substr($url,0,4)!="http") $url = "http://".$url;

    $userAgent = 
       'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)';

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT, 15);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);

    $execute = curl_exec($ch);

    // Check if any error occured
    if(!curl_errno($ch)) {
        $bytes      = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
        $total_time = curl_getinfo($ch, CURLINFO_TOTAL_TIME);
        $return = 'Took ' . $total_time . ' / Bytes: '. $bytes;        
    } else {
        $return = 'Error reaching domain';
    }
    curl_close($ch);

    return $return;

}

这是使用 fopen 的一个

function fopenTest($link) {

    if(substr($link,0,4)!="http"){ 
    $link = "http://".$link;
    }

    $timestart = microtime();

    $churl = @fopen($link,'r');

    $timeend = microtime();
    $diff = number_format(((substr($timeend,0,9)) + (substr($timeend,-10)) - 
        (substr($timestart,0,9)) - (substr($timestart,-10))),4);
    $diff = $diff*100;

    if (!$churl) {
        $message="Offline";
    }else{
        $message="Online. Time : ".$diff."ms ";
    }

    fclose($churl); 

    return  $message;

}

有没有更好的使用php ping 网站的方法?

【问题讨论】:

    标签: php curl web ping


    【解决方案1】:

    显然 curl 有各种很酷的东西,但请记住,您始终可以通过从命令行调用内置工具来使用它们,如下所示:

    $site = "google.com";
    ob_start();
    system("ping " . escapeshellarg($site));
    print ob_end_flush();
    

    唯一要记住的是,这不会像 curl 那样跨平台;虽然默认情况下也没有启用 curl 扩展..

    【讨论】:

    • 我会这样做 - 这样,如果您确实看到问题,您可以确信您看到的结果是有效的。
    • 听说过 escapeshellarg() 函数吗? ca.php.net/manual/en/function.escapeshellarg.php
    • 这个问题是它会 ping 服务器以查看它是否处于活动状态,而不是像 cURL 那样找出网络服务器是否处于活动状态......而且 cURL 将是特定于站点而不是特定于服务器(在测试虚拟主机环境时很有用。
    • escapeshellarg = 太棒了,谢谢。另外,很好地调用 cURL 测试网络服务器而不是服务器,我没有想到这一点。
    【解决方案2】:

    为一次性任务执行快速脚本时,我只需 exec() wget:

    $response = `wget http://google.com -O -`;
    

    这很简单,并且可以处理重定向。

    如果您使用 suhosin 补丁和 curl,您可能会遇到 http 重定向问题(301、302...), suhosin 不允许。

    【讨论】:

      【解决方案3】:

      我不确定 Curl/Fopen 但this benchmark 说 file_get_contents 比 fopen 有更好的性能。

      【讨论】:

        【解决方案4】:

        您可以使用 xmlrpc (xmlrpc_client)。不确定 curl 的优点/缺点是什么。

        Drupal 为此目的使用 xmlrpc(查看 ping 模块)。

        【讨论】:

        • 您是在谈论 drupal.org/handbook/modules/ping 吗?这看起来不是我要找的……
        • 我也觉得用这个也不错。在一个迂腐的猜测中,与直接的 curl 选项相比,这个选项可能需要在内部进行额外的 xml 解析?真的不知道。
        【解决方案5】:

        使用 curl 很好。

        不确定我是否会使用那个用户代理字符串。除非您特别需要,否则请定制一个。

        【讨论】:

          【解决方案6】:

          也许这个梨Net_Ping 就是你要找的。它不再维护,但它可以工作。

          【讨论】:

            【解决方案7】:

            如果启用了远程 fopen,file_get_contents() 也可以解决问题。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-10-24
              • 1970-01-01
              • 2011-05-12
              • 1970-01-01
              • 1970-01-01
              • 2013-06-20
              • 1970-01-01
              • 2010-09-23
              相关资源
              最近更新 更多