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






не используйте fopen () - он не поддерживает перенаправления и тому подобное.
Загляните в cURL. Есть библиотека для PHP.
Также существует исполняемая версия cURL, так что вы даже можете написать сценарий на bash.
Одна потенциальная проблема, с которой вы, несомненно, столкнетесь, - это когда ящик, на котором запущен этот скрипт, теряет доступ к Интернету ... вы получите 1000 ложных срабатываний.
Вероятно, для вашего сценария было бы лучше вести какую-то историю и сообщать о сбое только после 5 дней сбоя.
Кроме того, перед продолжением стандартных проверок сценарий должен каким-то образом выполнять самопроверку (например, проверять заведомо исправный веб-сайт [google?]).
Да, в конечном приложении есть важный исторический компонент. Я исключил это из соображений простоты. Кроме того, неплохо было бы проверить какой-нибудь известный URL-адрес. Спасибо. :)
На самом деле я написал что-то на PHP, что делает это с помощью базы данных из более чем 5k URL. Я использовал класс PEAR HTTP_Request, у которого есть метод под названием getResponseCode (). Я просто перебираю URL-адреса, передаю их getResponseCode и оцениваю ответ.
Однако он не работает для FTP-адресов, URL-адресов, которые не начинаются с http или https (не подтверждены, но я считаю, что это так), и сайтов с недействительными сертификатами безопасности (0 не найден). Кроме того, если сервер не найден, возвращается 0 (для этого нет кода состояния).
И это, вероятно, проще, чем cURL, поскольку вы включаете несколько файлов и используете одну функцию для возврата целочисленного кода.
Похоже, это может быть работа для завиток.
Если вы не застряли на PHP, Perl LWP тоже может быть ответом.
Аминь LWP. Perl лучше подходит, так как здесь нет тайм-аутов. Не говоря уже о том, что это круто. :)
Вы также должны знать, что 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-адресов - нетривиальная проблема.
Для этого вам понадобится только сценарий bash. Пожалуйста, проверьте мой ответ в аналогичном посте здесь. Это однострочный интерфейс, который повторно использует HTTP-соединения для значительного повышения скорости, повторяет n раз для временных ошибок и следует перенаправлениям.
200 - не единственный хороший код. Код 3xx означает перенаправление, и во многих случаях нужная страница - это то место, куда вы попали (но это не гарантируется). 401 тоже не обязательно «плохой», но и не 200.