Как с помощью PHP программно проверить действительные (не мертвые) ссылки?

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

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

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

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

Скрипт будет обрабатывать около 1000 URL за раз.

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

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

200 - не единственный хороший код. Код 3xx означает перенаправление, и во многих случаях нужная страница - это то место, куда вы попали (но это не гарантируется). 401 тоже не обязательно «плохой», но и не 200.

Thomas Owens 28.10.2008 22:36

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

Kip 28.08.2012 22:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
15
2
17 372
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

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

не используйте fopen () - он не поддерживает перенаправления и тому подобное.

Alex Weinstein 28.10.2008 23:49

Загляните в cURL. Есть библиотека для PHP.

Также существует исполняемая версия cURL, так что вы даже можете написать сценарий на bash.

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

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

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

Да, в конечном приложении есть важный исторический компонент. Я исключил это из соображений простоты. Кроме того, неплохо было бы проверить какой-нибудь известный URL-адрес. Спасибо. :)

GloryFish 28.10.2008 22:32

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

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

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

Похоже, это может быть работа для завиток.

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

Аминь LWP. Perl лучше подходит, так как здесь нет тайм-аутов. Не говоря уже о том, что это круто. :)

willasaywhat 28.10.2008 23:32

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

Ответ принят как подходящий

Используйте расширение 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-опция.

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

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

Это тоже серьезная проблема. Проверка хороших (или плохих) URL-адресов - нетривиальная проблема.

Thomas Owens 29.10.2008 00:43

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

Другие вопросы по теме