многопоточный сканер в PHP
Привет всем еще раз!
Нам нужна помощь, чтобы разработать и внедрить в наш сканер функциональность multi-curl. У нас огромный массивссылки для сканирования " и мы закидываем их с помощью Foreach.
Позволять's использовать псевдокод, чтобы понять логику:
1) While ($links_to_be_scanned > 0).
2) Foreach ($links_to_be_scanned as $link_to_be_scanned).
3) Scan_the_link() and run some other functions.
4) Extract the new links from the xdom.
5) Push the new links into $links_to_be_scanned.
5) Push the current link into $links_already_scanned.
6) Remove the current link from $links_to_be_scanned.
Теперь нам нужно определить максимальное количество параллельных соединений и иметь возможность запускать этот процесс для каждой ссылки параллельно.
Я понимаю что мынам нужно будет создать $ links_being_scanned или какую-то очередь.
Я действительно не уверен, как подойти к этой проблеме, если честно,если бы кто-нибудь мог предоставить какой-нибудь фрагмент или идею для его решения, это было бы очень признательно.
Заранее спасибо! Крис;
Extended:
Я только что понял, что сложная часть - это не сам мультискрутка, а количество операций, выполненных с каждой ссылкой после запроса.
Даже после того, как muticurl, я в конечном итоге должен был бы найти способ выполнить все эти операции параллельно. Весь алгоритм, описанный ниже, должен работать параллельно.
Итак, теперь переосмысливая, мы должны были бы сделать что-то вроде этого:
While (There's links to be scanned)
Foreach ($Link_to_scann as $link)
If (There's less than 10 scanners running)
Launch_a_new_scanner($link)
Remove the link from $links_to_be_scanned array
Push the link into $links_on_queue array
Endif;
И каждый сканер делает (это должно выполняться параллельно):
Create an object with the given link
Send a curl request to the given link
Create a dom and an Xdom with the response body
Perform other operations over the response body
Remove the link from the $links_on_queue array
Push the link into the $links_already_scanned array
Я предполагаю, что мы могли бы подойти к этому, создав новый файл PHP с алгоритмом сканера и используя pcntl_fork () для каждого параллельного процесса?
Поскольку даже используя multi-curl, мне в конечном итоге пришлось бы ждать зацикливания на регулярной структуре foreach для других процессов.
Я предполагаю, что мне нужно подойти к этому с помощью fsockopen или pcntl_fork.
Предложения, комментарии, частичные решения и даже "удачи" будет более чем оценено!
Большое спасибо!