php get_headers хороший способ узнать, работает ли сайт? - PullRequest
1 голос
/ 13 января 2012

Я все еще довольно новичок в php, можете ли вы прокомментировать, полезен ли приведенный ниже код, чтобы определить, работает ли сайт или нет, и если он может не подходить, причины и лучшие альтернативы?

Заранее спасибо.

$siteHeader = @get_headers($url , 1);
if ($siteHeader > 1) {
    $siteUp = true;
} else {
    $siteUp = false;
}

Ответы [ 3 ]

2 голосов
/ 13 января 2012

Я использую локон, но это только я:

function check($url, $ignore = '')
{
    $agent = "Mozilla/4.0 (B*U*S)";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_USERAGENT, $agent);

    curl_setopt($ch, CURLOPT_VERBOSE, false);
    curl_setopt($ch, CURLOPT_TIMEOUT, 45);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 45);

    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_NOBODY, true);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 5); //follow up to 10 redirections - avoids loops


    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); //fix for certificate issue
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); //fix for certificate issue


    $page = curl_exec($ch);
    $err = curl_error($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    $codes = array(
        0 => 'Domain Not Found',
        100 => 'Continue',
        101 => 'Switching Protocols',
        200 => 'OK',
        201 => 'Created',
        202 => 'Accepted',
        203 => 'Non-Authoritative Information',
        204 => 'No Content',
        205 => 'Reset Content',
        206 => 'Partial Content',
        300 => 'Multiple Choices',
        301 => 'Moved Permanently',
        302 => 'Found',
        303 => 'See Other',
        304 => 'Not Modified',
        305 => 'Use Proxy',
        307 => 'Temporary Redirect',
        400 => 'Bad Request',
        401 => 'Unauthorized',
        402 => 'Payment Required',
        403 => 'Forbidden',
        404 => 'Not Found',
        405 => 'Method Not Allowed',
        406 => 'Not Acceptable',
        407 => 'Proxy Authentication Required',
        408 => 'Request Timeout',
        409 => 'Conflict',
        410 => 'Gone',
        411 => 'Length Required',
        412 => 'Precondition Failed',
        413 => 'Request Entity Too Large',
        414 => 'Request-URI Too Long',
        415 => 'Unsupported Media Type',
        416 => 'Requested Range Not Satisfiable',
        417 => 'Expectation Failed',
        500 => 'Internal Server Error',
        501 => 'Not Implemented',
        502 => 'Bad Gateway',
        503 => 'Service Unavailable',
        504 => 'Gateway Timeout',
        505 => 'HTTP Version Not Supported'
    );

    $httpcode_out = 'http: ' . $httpcode . ' (' . $codes[$httpcode] . ')';
    $err = 'curl error: ' . $err;

    $out = array(
        $url,
        $httpcode_out,
        $err
    );

    if ($httpcode >= 200 && $httpcode < 307)
    {//good
        return array(
            'Work',
            $out
        );
    }
    else
    {//BAD
        return array(
            'Fail',
            $out
        );
    }
}
1 голос
/ 13 января 2012

В зависимости от вашего случая, но, особенно, если ваш URL предоставлен пользователем, я бы пошел на что-то подобное.

//returns true, if domain is availible, false if not
function isDomainAvailible($domain)
{
   //check if URL is valid
   if(!filter_var($domain, FILTER_VALIDATE_URL)){
           return false;
   }

   $agent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
   $ch = curl_init();
   curl_setopt ($ch, CURLOPT_URL, $url);
   curl_setopt ($ch, CURLOPT_USERAGENT, $agent);
   curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt ($ch,CURLOPT_VERBOSE, FALSE);
   curl_setopt ($ch, CURLOPT_TIMEOUT, 10);
   curl_setopt ($ch,CURLOPT_SSL_VERIFYPEER, FALSE);
   curl_setopt ($ch,CURLOPT_SSLVERSION, 3);
   curl_setopt ($ch,CURLOPT_SSL_VERIFYHOST, FALSE);
   $page=curl_exec($ch);
   //echo curl_error($ch);
   $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
   curl_close($ch);
   if ($httpcode >= 200 && $httpcode < 300) 
    return true;
   else 
    return false;
}

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

1 голос
/ 13 января 2012

Обновление: Чем больше я об этом думаю, тем менее хорошо это выглядит.Я расширил свой первоначальный ответ, который в ретроспективе был наивным.

Это хорошо для базового использования, но вы можете также проверить код ответа HTTP вместо того, чтобы просто проверять,Вы получили ответ.То, как работает код прямо сейчас, просто говорит о том, что кто-то слушал с другой стороны, что очень далеко от того, что большинство людей считают «сайт работает».

Вот как легкоизолируйте код ответа HTTP (или получите false, если запрос не выполнен):

$headers = get_headers('http://www.google.com');
$code = $headers ? intval(end(explode(' ', $headers[0], 2))) : false;

Кроме этого, существует также проблема перенаправлений: что вы делаете, если видите перенаправление?Сервер, к которому вы обратились, может быть в порядке, но сервер, на который вы перенаправлены, может быть недоступен.Если кто-то наберет URL-адрес в браузере, он будет перенаправлен и в конечном итоге истечет время ожидания, в то время как одношаговый тест скажет, что все в порядке.Что делать, если есть цикл перенаправления?Браузер обнаружит это и в конечном итоге истечет время ожидания, но вам нужно написать довольно много кода, чтобы сделать то же самое.

Таким образом, в конце концов, cURL выглядит как единственное верное решение, потому что он делает все это прозрачно.

...