Как проверить действительные (не мертвые) ссылки программно с помощью PHP? - PullRequest
15 голосов
/ 28 октября 2008

Учитывая список URL, я хотел бы проверить, что каждый URL:

  • Возвращает код состояния 200 OK
  • Возвращает ответ в течение X раз

Конечной целью является система, которая может помечать URL-адреса как потенциально неработающие, чтобы администратор мог их просмотреть.

Сценарий будет написан на PHP и, скорее всего, будет выполняться ежедневно через cron.

Сценарий будет обрабатывать приблизительно 1000 URL-адресов за один раз.

Вопрос состоит из двух частей:

  • Есть ли какие-нибудь важные ошибки с такой операцией, с какими проблемами вы столкнулись?
  • Каков наилучший метод проверки статуса URL в PHP с учетом как точности, так и производительности?

Ответы [ 9 ]

18 голосов
/ 28 октября 2008

Используйте расширение PHP cURL. В отличие от fopen () он также может отправлять HTTP-запросы HEAD, которые достаточны для проверки доступности URL-адреса и позволяют сэкономить массу трафика, поскольку вам не нужно загружать весь текст страницы для проверки.

В качестве отправной точки вы можете использовать такую ​​функцию, как эта:

function is_available($url, $timeout = 30) {
    $ch = curl_init(); // get cURL handle

    // set cURL options
    $opts = array(CURLOPT_RETURNTRANSFER => true, // do not output to browser
                  CURLOPT_URL => $url,            // set URL
                  CURLOPT_NOBODY => true,         // do a HEAD request only
                  CURLOPT_TIMEOUT => $timeout);   // set timeout
    curl_setopt_array($ch, $opts); 

    curl_exec($ch); // do it!

    $retval = curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200; // check if HTTP OK

    curl_close($ch); // close handle

    return $retval;
}

Однако существует множество возможных оптимизаций: вы можете захотеть повторно использовать экземпляр cURL и, если проверяете более одного URL на хост, даже повторно использовать соединение.

Да, и этот код строго проверяет HTTP-код ответа 200. Он не следует перенаправлениям (302) - но для этого также существует опция cURL.

6 голосов
/ 28 октября 2008

Посмотрите в CURL. Есть библиотека для PHP.

Существует также исполняемая версия cURL, чтобы вы могли написать скрипт на bash.

4 голосов
/ 28 октября 2008

Я на самом деле написал что-то на PHP, что делает это с базой данных 5k + URL. Я использовал класс PEAR HTTP_Request , который имеет метод с именем getResponseCode (). Я просто перебираю URL-адреса, передавая их getResponseCode и оцениваю ответ.

Однако это не работает для FTP-адресов, URL-адресов, которые не начинаются с http или https (неподтвержденные, но я считаю, что это так), а также для сайтов с недействительными сертификатами безопасности (0 не найдено). Кроме того, возвращается 0 для сервера не найден (для этого нет кода состояния).

И это, вероятно, проще, чем cURL, поскольку вы включаете несколько файлов и используете одну функцию для получения целочисленного кода.

2 голосов
/ 28 октября 2008
  1. fopen () поддерживает http URI.
  2. Если вам нужна большая гибкость (например, время ожидания), посмотрите на расширение cURL.
1 голос
/ 28 октября 2008

Недостаточно просто вернуть ответ 200; многие действительные ссылки будут продолжать возвращать «200» после того, как они превращаются в порно / игорные порталы, когда бывший владелец не продлит.

Доменные сквоттеры обычно гарантируют, что каждый URL в их доменах возвращает 200.

1 голос
/ 28 октября 2008

Вам также следует знать об URL-адресах, возвращающих 301 или 302 HTTP-ответа, которые перенаправляют на другую страницу. Обычно это не означает, что ссылка недействительна. Например, http://amazon.com возвращает 301 и перенаправляет на http://www.amazon.com/.

1 голос
/ 28 октября 2008

Кажется, это может быть работа для curl .

Если вы не застряли на PHP, LWP от Perl тоже может быть ответом.

0 голосов
/ 07 июля 2012

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

0 голосов
/ 28 октября 2008

Одна потенциальная проблема, с которой вы, несомненно, столкнетесь, - это когда окно, на котором работает этот скрипт, теряет доступ к Интернету ... вы получите 1000 ложных срабатываний.

Вероятно, для вашего сценария было бы лучше сохранить некоторый тип истории и сообщать о сбое только после 5 дней сбоя.

Кроме того, сценарий должен как-то самопроверяться (например, проверять известный хороший веб-сайт [google?]) Перед тем, как продолжить стандартные проверки.

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