Каков наилучший метод для проверки URL на черный список в PHP - PullRequest
0 голосов
/ 19 сентября 2009

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

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

Ответы [ 4 ]

3 голосов
/ 19 сентября 2009

Если вы хотите исключить доменные имена или какой-либо URL, который не имеет «переменной части», может быть решение использовать базу данных с таблицей, содержащей только URL, с правильным индексом и выполнить быстрое сопоставление.

Выяснение того, не должен ли обрабатываться URL, будет только вопросом или выполнение быстрого запроса к этой БД (что обычно означает "URL равно" или "URL начинается с") - - которая может быть такой же простой, как БД SQLite, которая помещается в файл и не требует дополнительного сервера.


Идея PHP-массива имеет один недостаток: когда ваш массив станет больше, ему потребуется все больше и больше памяти только для того, чтобы он был в памяти - и, в один прекрасный день, вам понадобится слишком много памяти и вы попадете memory_limit; если у вас более нескольких тысяч URL-адресов, это решение может оказаться не лучшим.

Тем не менее, если у вас есть только несколько URL-адресов или шаблонов, идея создания массива PHP, циклического перемещения по нему и сравнения каждого значения с strpos (для «содержит» или «начинается с») или preg_match (для регулярных выражений) отлично подойдет - и самый простой в реализации.


Если вы хотите использовать какое-то сложное правило сопоставления, использование какого-либо регулярного выражения, вероятно, будет вашим единственным реальным способом ... Будь то на стороне PHP, с preg_match или на сервере SQL (MySQL, например, имеет поддержку для регулярных выражений, насколько я знаю, - хотя понятия не имею о производительности, см. 11.4.2. Регулярные выражения для получения дополнительной информации)

1 голос
/ 19 сентября 2009

Вы должны хранить сайты в хэше и выглядеть так. это просто и элегантно:

    $excluded['www.google.com'] = true;
    $excluded['www.mapquest.com'] = true;
    $excluded['www.yahoo.com'] = true;

    $url = "http://www.google.com?q=barefoot+winery";

    $urlArray = parse_url($url)

    if (! isset($excluded[$urlArray['host']]))
    {
        scrape($url)
    }

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

0 голосов
/ 19 сентября 2009

Будете ли вы каждый раз загружать в память длинный список предметов?Я думаю, что egrep или grep будет лучшим методом.В Linux ваш файл останется в файловом кеше, и результаты будут очень быстрыми, а так как egrep будет проходить через файл, не каждый поток apache будет иметь копию списка в памяти.

0 голосов
/ 19 сентября 2009

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

Если вам нужно только увидеть точные совпадения и никаких шаблонов, вы можете использовать strpos или что-то подобное, чтобы просто выполнить прямое сопоставление строк, что должно быть несколько быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...