Intereting Posts
Почти двойное обнаружение в Solr Эффективный способ расчета количества внешних ключей во второй таблице и отображения его с помощью строк из первой таблицы – PHP – MySQL Могу ли я установить Ion auth для входа по имени пользователя или по электронной почте Лучшее решение для защиты PHP-кода без шифрования Как отобразить json в uitextview из NSDictionary Значения, разделенные запятыми, в предложении MySQL «IN» phpmyadmin в xampp не работает на Windows 10 Как вызвать внешние веб-службы PHP с помощью WSO2 ESB Apache, javascript и PhoneGap: Каков наилучший способ прослушать какое-то случайное событие? Интервал или длительный опрос? Ошибка в строке 14, php curl dom Как создать макет объекта сущности доктрины? md5 (uniqid) имеет смысл для случайных уникальных токенов? Как заставить SSL работать в fsockopen? Как преобразовать формат времени, который я получил от PHP, в формат, который принимает обратный отсчет jQuery Уникальный цифровой генератор Alpha

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

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

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

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

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

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

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

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

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

Посмотрите на cURL. Там есть библиотека для PHP.

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

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

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

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

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

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

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

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

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

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

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

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

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

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