ホームページ  >  記事  >  バックエンド開発  >  PHP は QPM を使用してマルチプロセス並列タスク ハンドラーを実装します

PHP は QPM を使用してマルチプロセス並列タスク ハンドラーを実装します

WBOY
WBOYオリジナル
2016-06-23 13:39:06981ブラウズ

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/...END

QPM の 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';}}

実際の運用環境では、ファイル入力をキューに置き換えて、の長期にわたる生産者/消費者モデル プログラム。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。