Параллельная обработка / разветвление в PHP для ускорения проверки больших массивов
У меня есть php-скрипт на моем сайте, который предназначен для того, чтобы дать хороший обзор доменного имени, которое вводит пользователь. Он делает эту работу довольно хорошо, однако это очень медленно. Это может быть как-то связано с тем, что он проверяет массив из 64 возможных доменных имен, а затем переходит к проверке серверов имен для записей/записей MX/записей NS и т. д.
Что я хотел бы знать, возможно ли запустить несколько потоков / дочерних процессов этого? Так что он будет проверять несколько эллементы массива сразу, и генерировать выходные данные теряется быстрее?
Я поместил пример своего кода в pastebin (чтобы избежать создания огромного и спам-поста здесь)
http://pastebin.com/Qq9qKtP9
В perl я могу сделать что-то вроде этого:
$fork = new Parallel::ForkManager($threads);
foreach(Something here){
$fork->start and next;
$fork->finish;
}
И я мог бы заставить цикл работать в стольких процессах, сколько потребуется. Возможно ли что-то подобное в PHP или любыми другими способами, которые вы можете придумать, чтобы ускорить это? Главная проблема заключается в том, что cloudflare имеет тайм-аут, и часто это пройдет достаточно много времени, и CF заблокирует происходящий отклик.
Спасибо
3 ответов:
Первое, что вы хотите сделать, - это оптимизировать свой код, чтобы максимально сократить время выполнения. Например, вместо выполнения пяти dns-запросов:
$NS = dns_get_record($murl, DNS_NS); $MX = dns_get_record($murl,DNS_MX); $SRV = dns_get_record($murl,DNS_SRV); $A = dns_get_record($murl,DNS_A); $TXT = dns_get_record($murl,DNS_TXT);Вы можете вызвать dns_get_record только один раз:
$DATA = dns_get_record($murl, DNS_NS + DNS_MX + DNS_SRV + DNS_A + DNS_TXT);и проанализируйте переменные оттуда.Вместо того, чтобы прямо разветвлять процессы для одновременной обработки нескольких частей, я бы реализовал очередь, в которую будут помещены все запросы. Обработчик запросов будет ограничен количеством элементов, которые он может использовать. обрабатывайте сразу, избегая потенциального DoS, если сотни или тысячи запросов попадают на ваш сайт одновременно. Без какого-то ограничивающего механизма вы бы закончили с таким количеством процессов, что сервер мог бы зависнуть.
Что касается процессора, в дополнение к ранее упомянутым элементам, вы можете попробовать pecl/Gearman в качестве процессора очереди. Я им не пользовался, но, похоже, он делает то, что вы ищете.Другой метод оптимизации - это реализация кэширования. система, которая сохраняла результаты, скажем, на неделю (или что-то еще). Это сократило бы количество людей, которые просматривают один и тот же сайт несколько раз в день (или запускают скрипт на вашем сайте).
* Не Обращайте Внимания На Поддержку !! *
Вы Никогда не хотите создавать потоки (или дополнительные процессы для этого) в прямом ответе на веб-запрос.
Если ваш интерфейс получает инструкции создавать 60 потоков каждый раз, когда кто-то нажимает на
page.php, и 100 человек приходят и запрашиваютpage.phpсразу, вы будете просить Ваше оборудование создавать и выполнять 6000 потоков одновременно, не говоря уже о потоках, используемых службами операционной системы и другим программным обеспечением. Для понятным причинам, этого не делает, и никогда не будет масштабироваться.Скорее вы хотите отделить те части приложения, которые требуют дополнительных потоков или процессов, и взаимодействовать с этой частью приложения через какой-то нормальный RPC. Это означает, что серверная часть приложения может использовать параллелизм с помощью pthreads или разветвления, используя фиксированное число потоков или процессов и распределяя работу как можно более равномерно по всем доступным ресурсам. Это позволяет обеспечить приток трафик; это позволяет масштабировать ваше приложение.
Я не буду писать пример кода, это кажется слишком тривиальным.
Я сомневаюсь, что это хорошая идея, чтобы развилить с PHP процесс apache. Но если вы действительно хотите есть PCNTL (который не доступен в модуле apache).
Возможно, Вам будет веселее с pthread. В настоящее время вы даже можете скачать PHP, который претендует на threadsafe.
И, наконец, у вас есть возможность использовать классический неблокирующий IO, который я бы предпочел в случае PHP.
Comments