PHP を使用して次のシナリオを実装することを検討してください。 クロールされたサイトの URL リストがキューに保存されており、バックグラウンド プログラムがキューを読み取り、それを子プロセスに転送して HTML をキャプチャし、ファイルに保存します。 効率を向上させるために、複数のタスクを並行して実行できますが、過度のマシン負荷を避けるために、並列タスクの最大数は制限されています (テストの便宜上、この数を 3 に設定します)。キューからENDマークを取り出し、プログラムの実行を終了します。
このシナリオは、QPM の Supervisor::taskFactoryMode() を使用して実装されており、非常に簡単です。
QPM の正式名は、Quick Process Management Module for PHP です。PHP は強力な Web 開発言語であるため、PHP を使用して堅牢なコマンド ライン (CLI) プログラムやデーモン プログラムを開発できることを忘れがちです。 デーモン プログラムを作成すると、必然的にさまざまなプロセス管理が必要になります。 QPM は、プロセス管理を簡素化するために正式に開発されたクラス ライブラリです。 QPM のプロジェクト アドレスは次のとおりです: https://github.com/Comos/qpm
テスト環境を簡素化するために、テキスト ファイルを使用してキュー データをシミュレートできます。完全なサンプル ファイルはこちらを参照してください: Spider_task_factory_data.txt
http://news.sina.com.cn/http://news.ifeng.com/http://news.163.com/http://news.sohu.com/http://ent.sina.com.cn/http://ent.ifeng.com/...ENDQPM の taskFactoryMode を使用する前に、TaskFactory クラスを準備する必要があります。 これを SpiderTaskFactory と名付け、SpdierTaskFactory のファクトリ メソッド fetchTask は通常どおり Runnable サブクラスのインスタンスを返します。 END またはファイルの終わりに達した場合、StopSignal をスローするとプログラムは終了します。
以下は、Supervisor をアセンブルして実行するためのコード スニペットです。完全な例については、次を参照してください: Spider_task_factory.php
//如果没有从参数指定输入,把spider_task_factory_data.txt作为数据源$input = isset($argv[1]) ? $argv[1] : __DIR__.'/spider_task_factory_data.txt';$spiderTaskFactory = new SpiderTaskFactory($input);$config = [ //指定taskFactory对象和工厂方法 'factoryMethod'=>[$spiderTaskFactory, 'fetchTask'], //指定最大并发数量为3 'quantity' => 3,];//启动Supervisorqpm\supervisor\Supervisor::taskFactoryMode($config)->start();SpiderTaskFactory の実装は次のとおりです:
/** * 任务工厂,必须实现 fetchTask方法。 * 该方法正常返回 * */class SpiderTaskFactory {private $_fh;public function __construct($input) { $this->_input = $input; $this->_fh = fopen($input, 'r'); if ($this->_fh === false) { throw new Exception('fopen failed:'.$input); }}public function fetchTask() { while (true) { if (feof($this->_fh)) { throw new qpm\supervisor\StopSignal(); } $line = trim(fgets($this->_fh)); if ($line == 'END') { throw new qpm\supervisor\StopSignal(); } if (empty($line)) { continue; } break; } return new SpiderTask($line);}}SpiderTask の実装は次のとおりです:
/** * 在子进程中执行任务的类 * 必须实现 qpm\process\Runnable 接口 */class SpiderTask implements qpm\process\Runnable {private $_target;public function __construct($target) { $this->_target = $target;}//在子进程中执行的部分public function run() { $r = @file_get_contents($this->_target); if ($r===false) { throw new Exception('fail to crawl url:'.$this->_target); } file_put_contents($this->getLocalFilename(), $r); }private function getLocalFilename() { $filename = str_replace('/', '~', $this->_target); $filename = str_replace(':', '_', $filename); $filename = $filename.'-'.date('YmdHis'); return __DIR__.'/_spider/'.$filename.'.html';}}実際の運用環境では、ファイル入力をキューに置き換えて、の長期にわたる生産者/消費者モデル プログラム。