Как быстро просканировать большой текстовый файл на предмет доменного имени? (Laravel, PHP) - PullRequest
2 голосов
/ 21 января 2020

У меня большой текстовый файл, который проверяется на наличие "плохих URL". При обработке нескольких URL-адресов для этого списка требуется около 1 секунды на URL-адрес, чтобы убедиться, что его нет в этом списке.

Вот мой текущий код:

$badDomainsFile = file_get_contents(base_path().'/resources/txt/bad-domains.txt');
$badDomains = explode("\n",$badDomainsFile);
foreach ($badDomains as $badDomain){
   if($badDomain===$domain){
      $isBadDomain = true;
      break;
   }
}

Я подумал, что мог бы ускорить работу с помощью некоторого кода в стиле exe c ('grep -n $ path'), но у меня возникают проблемы с его работой на локальном компьютере (windows), и я считаю, что путь к файлу будет другим сервер (linux) в любом случае? Все, что в laravel на моем локальном компьютере, запускается через Homestead, но я также запутался, если, возможно, сценарий php будет запускаться для этого пути к файлу или для моего собственного локального системного местоположения веб-сайта?

Любой другие идеи, чтобы ускорить этот сценарий? (Я попытался запустить построчный скрипт в стиле fgets (), но это заняло до 11 секунд на URL.)

Ответы [ 2 ]

1 голос
/ 21 января 2020

Масштабируемым решением было бы сохранить список в базе данных (MySQL или все, что вы используете для остальной части приложения) и позволить движку позаботиться об оптимизации. Любой приличный движок БД позволит индексировать и кэшировать список «из коробки». Таким образом, сокращается время загрузки и ускоряется поиск.

Когда вы читаете из файла, каждый раз, когда весь файл загружается с диска и выполняется полное сканирование. Эта операция имеет сложность O(n)

При чтении из индексированного списка с уникальными элементами сложность составляет O(1)

Даже если список увеличивается до миллиардов элементов, влияние на Скорость поиска будет незначительной.

1 голос
/ 21 января 2020

Вы читаете из файла. Вы можете попробовать прочитать его один раз и сохранить в каком-то кеше, например в memcached или redis. Это должно дать вам лучшую производительность.

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