3

我想创建一个 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 一个网站?

4

7 回答 7

5

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

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

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

于 2009-07-20T19:59:01.383 回答
2

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

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

它很简单,并且负责重定向。

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

于 2009-07-20T19:58:16.957 回答
1

我不确定 Curl/Fopen 但这个基准测试表明 file_get_contents 比 fopen 有更好的性能。

于 2009-07-20T19:58:59.450 回答
0

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

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

于 2009-07-20T19:48:00.643 回答
0

使用 curl 很好。

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

于 2009-07-20T19:51:07.843 回答
0

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

于 2009-07-20T19:53:15.267 回答
0

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

于 2009-07-20T20:04:23.387 回答