Проверьте, работает ли ссылка, и если нет, визуально идентифицируйте ее как неработающую

Я работаю над проектом, в котором перечислены URL-адреса для обмена файлами, такие как Oron, filespost, depositfiles и т. Д., В котором сообщается о совместном использовании материалов, защищенных авторским правом, выявленным владельцам контента и правообладателям в моей сети.

Чтобы лучше улучшить сервис, который в настоящее время стоит в таблице, заполненной базой данных MySQL с некоторыми фильтрами, встроенными в php, я хочу иметь возможность идентифицировать ссылки, которые перестали функционировать.

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

В настоящее время нет быстрого и простого визуального представления активных или неактивных ссылок.

У меня есть простая проверка URL, основанная на том, что если ошибка 404 получена, но быстро поняла, что это не сработает, учитывая, что эти сайты не 404 или даже перенаправляют, они изменяют динамически сгенерированную страницу, чтобы сказать, что файл недоступен или файл был удален и т. д.

Я также включил скрипт проверки ссылок, который использует третью часть службы проверки ссылок на файлы, но для этого потребуются ручные проверки и ручное обновление базы данных.

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

Также было бы полезно, если бы тогда URL-адреса могли быть отфильтрованы на основе активного статуса. Я предполагаю, что если изменение цвета осуществлялось с помощью класса ссылок или стиля ячеек, я мог бы отфильтровать столбец по классу, например: link-dead или link-active. Я думаю, что могу сделать это, так что помощь с этим последним битом при фильтрации по классам не обязательно требуется.

Любая помощь будет принята с благодарностью.

1 ответ

Решение

Так как сайты, которые вы хотите проверить, созданы разными людьми, вряд ли найдется одна строка для определения, не сломана ли ссылка на большом количестве сайтов.

Я предлагаю вам создать простую функцию для каждого сайта, которая определяет, не сломана ли ссылка на этот конкретный сайт. Если вы хотите проверить ссылку, вы должны решить, какую функцию запускать в HTML-коде внешнего сайта, основываясь на имени домена.

Вы можете использовать parse_url() для извлечения домена / хоста из файловых ссылок:

// Get your url from the database. Here I'll just set it:
$file_url_from_database = 'http://example.com/link/to/file?var=1&hello=world#file'

$parsed_link = parse_url($file_url_from_database);
$domain = $parsed_link['host']; // $domain now equals 'example.com'

Вы можете сохранить имена функций в ассоциативном массиве и вызывать их так:

function check_domain_com(){ ... }
function check_example_com(){ ... }

$link_checkers = array();
$link_checkers['domain.com'] = 'check_domain_com';
$link_checkers['example.com'] = 'check_example_com';

или сохраните функции в массиве (PHP >=5.3).

$link_checkers = array();
$link_checkers['domain.com'] = function(){ ... };
$link_checkers['example.com'] = function(){ ... };

и назвать их с

if(isset($link_checkers[$domain]))
    // call the function stored under the index 'example.com'
    call_user_func($link_checkers[$domain]); 
else
    throw( new Exception("I don't know how to check the domain $domain") );

В качестве альтернативы вы можете просто использовать кучу операторов if

if($domain == 'domain.com')
    check_domain_com();
else if($domain == 'example.com')
    check_example_com(); // this function is called

Функции могут возвращать логическое значение (true или false; 0 или 1) для использования или сами вызывать другую функцию при необходимости (например, чтобы добавить дополнительный класс CSS к неработающим ссылкам).

Недавно я сделал нечто похожее, хотя собирал метаданные для стоковой фотографии с нескольких сайтов. Я использовал абстрактный класс, потому что у меня было несколько функций для каждого сайта.

Как примечание, было бы разумно сохранить последнюю проверенную дату в вашей базе данных и ограничить частоту проверки до 24 или 48 часов (или дальше друг от друга, в зависимости от ваших потребностей).


Изменить, чтобы уточнить реализацию немного:

Поскольку HTTP-запросы к другим веб-сайтам потенциально очень медленные, вам нужно проверять и обновлять статусы ссылок независимо от загрузки страниц. Вы можете достичь этого следующим образом:

  • Сценарий может запускаться каждые 12 часов и проверять все ссылки из базы данных, которые в последний раз проверялись более 24 часов назад. Для каждой "старой" ссылки будет обновлено active а также last_checked столбцы в вашей базе данных соответственно.
  • Когда кто-то запрашивает страницу, ваш скрипт будет читать из active столбец в вашей базе данных вместо загрузки удаленной страницы для проверки каждый раз.
  • (дополнительная мысль) Когда отправляется новая ссылка, она сразу же проверяется в сценарии или добавляется в очередь для проверки сервером как можно скорее.

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

Обратите внимание, что потенциально ресурсоемкий скрипт update-all не должен быть исполняемым (доступным) через Интернет.

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