みなさん、こんにちは!
マルチカール機能を開発してクローラーに実装するには、いくつかの支援が必要です。「スキャンするリンク」の膨大な配列があり、Foreachを使用してループスローします。
ロジックを理解するためにいくつかの擬似コードを使用してみましょう:
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またはある種のキューを作成する必要があることを理解しています。
正直に言うと、この問題にどのように取り組むかは本当にわかりません。誰かがそれを解決するためのスニペットやアイデアを提供できれば、それは大いにありがたいです。
前もって感謝します!クリス;
拡張:
これはマルチカール自体がトリッキーな部分ではなく、リクエスト後に各リンクで実行される操作の量であることに気づきました。
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()を使用して、これにアプローチできると思いますか?
マルチカールを使用している場合でも、最終的には他のプロセスの通常のforeach構造でループするのを待つ必要があります。
fsockopenまたはpcntl_forkを使用してこれにアプローチする必要があると思います。
提案、コメント、部分的な解決策、そして「幸運」さえもありがたいです!
どうもありがとう!