Разработчику. Сборник рецептов PHP
Задавайте вопросы

Программа: обнаружение устаревших
сылок

Вернуться назад

Программа stale-links.php выдает список ссылок на странице и их статус. Она сообщает, действительны ли ссылки, не перемещены ли они куда-нибудь, или они уже недействительны. Запустите программу, передав ей URL для сканирования ссылок:

% stale-links.php http://www.oreilly.com/

http://www.oreilly.com/index.html: OK
http://www.oreillynet.com: OK
http://conferences.oreilly.com: OK
http://international.oreilly.com: OK
http://safari.oreilly.com: MOVED: mainhom.asp?home

Для получения страниц программа tale-links.php использует расширение c URL. Сначала она извлекает содержимое URL, указанного в командной строке. После получения страницы программа извлекает ссылки, имеющиеся на этой странице, с помощью функции pc_link_extractor() из рецепта(Извлечение ссылок из HTML-файла) Затем, после присоединения базового URL в начало каждой ссылки, если это необходимо, запрашивается содержимое ссылки. Нам нужны лишь заголовки ответа, поэтому мы выбираем метод HEAD вместо метода GET, устанавливая параметр

CURLOPT_NOBODY. Если установить параметр CURLOPT_HEADER, то функция curl_exec() включит заголовки ответа в возвращаемую ею строку. На основании кода ответа выводится статус ссылки вместе с новым местоположением, если оно было изменено.

Пример 11.5. stale"links.php

function_exists('curl_exec') or die('CURL extension required');

function pc_link_extractor($s) {
       $a = array();
       if (preg_match_all(
              '/<A\s+.*?HREF=[\"\']?([^\"\' >]*)[\"\']?[^>]*>(.*?)<\/A>/i',
              $s,$matches,PREG_SET_ORDER)) {
       foreach($matches as $match) {
              array_push($a,array($match[1],$match[2]));
       }
}
return $a;
}
$url = $_SERVER['argv'][1];

// извлекаем содержимое URL
$c = curl_init($url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_FOLLOWLOCATION,1);
$page = curl_exec($c);
$info = curl_getinfo($c);
curl_close($c);

// определяем базовый url из url
// при этом не обращаем внимания на тег <base> на этой странице
$url_parts = parse_url($info['url']);
if ('' == $url_parts['path']) { $url_parts['path'] = '/'; }
$base_path = preg_replace('<^(.*/)([^/]*)$>','\\1',$url_parts['path']);
$base_url = sprintf('%s://%s%s%s',
              $url_parts['scheme'],
              ($url_parts['username'] || $url_parts['password']) ?
              "$url_parts[username]:$url_parts[password]@" : '',
              $url_parts['host'],
              $url_parts['path']);
// запоминаем ссылки, которые мы посетили, чтобы не посещать
// их более одного раза
$seen_links = array();

if ($page) {
       $links = pc_link_extractor($page);
       foreach ($links as $link) {
              // вычисляем относительные ссылки
              if (! (preg_match('{^(http|https|mailto):}',$link[0]))) {
                     $link[0] = $base_url.$link[0];
              }

// пропускаем данную ссылку, если мы ее уже видели
if ($seen_links[$link[0]]) {
       continue;
}

// отмечаем данную ссылку как просмотренную
$seen_links[$link[0]] = true;

// выводим содержимое ссылки, на которой находимся
print $link[0].': ';
flush();

// посещаем ссылку
$c = curl_init($link[0]);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_NOBODY, 1);
curl_setopt($c, CURLOPT_HEADER, 1);
$link_headers = curl_exec($c);
$curl_info = curl_getinfo($c);
curl_close($c);

switch (intval($curl_info['http_code']/100)) {
case 2:
        // коды ответа 2xx означают, что со страницей все в порядке
       $status = 'OK';
       break;
case 3:
       // коды ответа 3xx означают переадресацию
       $status = 'MOVED';
       if (preg_match('/^Location: (.*)$/m',$link_headers,$matches)) {
              $location = trim($matches[1]);
              $status .= ": $location";
       }
       break;
default:
       // остальные коды ответа означают ошибки
       $status = "ERROR: $curl_info[http_code]";
       break;
       }

print "$status\n";
       }
}

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования

Рейтинг Сайтов ДОСКИ.РУ