考慮用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...