Учитывая список URL-адресов, я хотел бы проверить, что каждый URL-адрес:
Конечной целью является система, которая способна помечать URL-адреса как потенциально поврежденные, чтобы администратор мог их просматривать.
Сценарий будет написан на PHP и, скорее всего, будет работать ежедневно через cron.
Сценарий будет обрабатывать около 1000 URL-адресов.
Вопрос состоит из двух частей:
Используйте расширение 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, поскольку вы включаете несколько файлов и используете одну функцию для получения целочисленного кода.
Похоже, это может быть работа для завитки .
Если вы не застряли на 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 раз для временных ошибок и следует за перенаправлениями.