Использование php для проверки связи с сайтом - PullRequest
3 голосов
/ 20 июля 2009

Я хочу создать php-скрипт, который будет пинговать домен и перечислять время ответа вместе с общим размером запроса.

Это будет использоваться для мониторинга сети веб-сайтов. Я попробовал это с 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?

Ответы [ 7 ]

5 голосов
/ 20 июля 2009

Очевидно, что в curl есть много интересных вещей, но помните, что вы всегда можете использовать встроенные инструменты, вызывая их из командной строки следующим образом:

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

Единственное, что нужно иметь в виду, это не будет кроссплатформенным, как может быть скручивание; хотя расширение curl не включено по умолчанию либо ..

2 голосов
/ 20 июля 2009

При выполнении быстрых сценариев для одноразовых заданий я просто выполняю wec () wget:

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

Это просто и заботится о перенаправлениях.

Если вы используете патчи suhosin и curl, вы можете столкнуться с проблемами при перенаправлении http (301, 302 ...), Сухозин этого не допустит.

1 голос
/ 20 июля 2009

Я не уверен насчет Curl / Fopen, но этот тест говорит, что файл_get_contents имеет лучшую производительность, чем fopen.

0 голосов
/ 21 июля 2009

Если удаленная функция fopen включена, file_get_contents() тоже сработает.

0 голосов
/ 20 июля 2009

возможно эта груша Net_Ping - это то, что вы ищете. Больше не поддерживается, но работает.

0 голосов
/ 20 июля 2009

Использование curl - это нормально.

Не уверен, что если бы я использовал эту строку useragent. Скорее сделайте заказной, если вам это не нужно.

0 голосов
/ 20 июля 2009

Вы можете использовать xmlrpc ( xmlrpc_client ). Не уверен, что преимущества / недостатки кудри.

Drupal использует xmlrpc для этой цели (посмотрите на модуль ping).

...