Проверить, существует ли удаленная страница с использованием PHP? - PullRequest
3 голосов
/ 12 ноября 2009

В PHP, как я могу определить, существует ли какой-либо удаленный файл (доступ по HTTP)?

Ответы [ 6 ]

8 голосов
/ 12 ноября 2009
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
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, 10); //follow up to 10 redirections - avoids loops
$data = curl_exec($ch);
curl_close($ch);
if (!$data) {
  echo "Domain could not be found";
}
else {
  preg_match_all("/HTTP\/1\.[1|0]\s(\d{3})/",$data,$matches);
  $code = end($matches[1]);
  if ($code == 200) {
    echo "Page Found";
  }
  elseif ($code == 404) {
    echo "Page Not Found";
  }
}

Модифицированная версия кода с здесь .

2 голосов
/ 12 ноября 2009

Эта функция вернет код ответа (последний в случае перенаправления) или false в случае днс или другой ошибки. Если указан один аргумент (URL), выполняется запрос HEAD. Если задан второй аргумент, делается полный запрос, и содержимое ответа, если таковое имеется, сохраняется по ссылке в переменной, переданной во втором аргументе.

function url_response_code($url, & $contents = null)
{
    $context = null;
    if (func_num_args() == 1) {
        $context = stream_context_create(array('http' => array('method' => 'HEAD')));
    }
    $contents = @file_get_contents($url, null, $context);
    $code = false;
    if (isset($http_response_header)) {
        foreach ($http_response_header as $header) {
            if (strpos($header, 'HTTP/') === 0) {
                list(, $code) = explode(' ', $header);
            }
        }
    }
    return $code;
}
2 голосов
/ 12 ноября 2009

Мне нравится curl или fsockopen, чтобы решить эту проблему. Любой из них может предоставить данные заголовка, касающиеся статуса запрашиваемого файла. В частности, вы бы искали ответ 404 (файл не найден). Вот пример, который я использовал с fsockopen:

http://www.php.net/manual/en/function.fsockopen.php#39948

1 голос
/ 12 ноября 2009

Я недавно искал ту же информацию. Нашел действительно хороший код здесь: http://php.assistprogramming.com/check-website-status-using-php-and-curl-library.html

    function Visit($url){

    $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, 5);
    $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;
    }

}

    if(Visit("http://www.site.com")){
        echo "Website OK";
    }
    else{
        echo "Website DOWN";
    }
0 голосов
/ 18 июня 2013

Просто обратите внимание, что эти решения не будут работать на сайте, который не дает соответствующего ответа для не найденной страницы. например, у меня только что была проблема с тестированием страницы на сайте, поскольку она просто загружает главную страницу сайта, когда получает запрос, который не может обработать. Таким образом, сайт почти всегда дает ответ 200 даже для несуществующих страниц.

Некоторые сайты выдают пользовательскую ошибку на стандартной странице и все равно не выдают заголовок 404.

В этих ситуациях вы мало что можете сделать, если не знаете ожидаемое содержимое страницы и не начинаете тестировать, существует ли ожидаемое содержимое, или проверяете какой-либо ожидаемый текст ошибки на странице, и все становится немного грязно ... 1005 *

0 голосов
/ 12 ноября 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...