PHP使用QPM實現多程序並行任務處理程式

2021-06-28 23:48:15 字數 2103 閱讀 5624

考慮用php實現以下場景: 有乙個抓站的url列表儲存在佇列裡,後台程式讀取這個佇列,然後轉交給子程序去抓取html存放到檔案裡。 為了提高效率,允許多工並行執行,但為了避免機器負載過高,限制了最大的並行任務數(為了測試方便,我們把這個數設為3),當佇列中取到 end標記時,程式結束執行。

這個場景用qpm的supervisor::taskfactorymode()實現,非常簡單。

qpm全名是 quick process management module for php. php 是強大的web開發語言,以至於大家常常忘記php 可以用來開發健壯的命令列(cli)程式以至於daemon程式。 而編寫daemon程式免不了與各種程序管理打交道。qpm正式為簡化程序管理而開發的類庫。qpm的專案位址是:

為了,簡化測試環境,我們可以用乙個文字檔案來模擬佇列的資料。完整的例子檔案看這裡:spider_task_factory_data.txt

...end使用qpm的taskfactorymode之前,我們需要準備乙個taskfactory類。 我們將其命名為 spidertaskfactory,spdiertaskfactory 的工廠方法fetchtask 正常返回 runnable的子類的例項。當碰到end或檔案結束,則throw 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,

];//啟動supervisor

qpm\supervisor\supervisor::taskfactorymode($config)->start();

spidertaskfactory 的實現如下:

/**

* 任務工廠,必須實現 fetchtask方法。

* 該方法正常返回

* */

class

spidertaskfactory

}public

function

fetchtask

() $line = trim(fgets($this->_fh));

if ($line == 'end')

if (empty($line))

break;

}return

new spidertask($line);

}}

spidertask 的實現如下:

/**

* 在子程序中執行任務的類

* 必須實現 qpm\process\runnable 介面

*/class

spidertask

implements

qpm\process\runnable

//在子程序中執行的部分

public

function

run()

file_put_contents($this->getlocalfilename(), $r);

}private

function

getlocalfilename

() }

真實的生產環境,用佇列替換檔案輸入,即可實現持久執行的生產者/消費者模型的程式。

php多程序實現

php多程序實現 php有一組程序控制函式 編譯時需要 enable pcntl與posix擴充套件 使得php能在nginx系統中實現跟c一樣的建立子程序 使用exec函式執行程式 處理訊號等功能。方便極了。下面是示例 php view plain copy print header conten...

PHP多程序使用

在我們生活中很少會用都多程序,一般在於處理資料多以及密集計算的業務中 下面我舉乙個例子給大家 利用多程序批量更新資料 php productmodel new product count productmodel count limit 100 page 1 maxpage ceil count l...

php實現多程序和關閉程序

一 php實現多程序 php有個pcntl fork的函式可以實現多程序,但要載入pcntl拓展,而且只有在linux下才能編譯這個拓展.先 arr 30000000 500000000 7000000000 8000000 foreach arr as key item else if pid k...