一般有兩種方法,一種是使用php自帶的pcntl_*函式(僅限linux),另一種就是使用popen/proc_open,然後在php內部控制程序數量。
php提供了一系列的pcntl_*函式,顧名思義就是process control functions,專門用來管理程序的。最常用的就是pcntl_fork和pcntl_wait。
pcntl_fork的作用就是從當前的程序再派生出乙個子程序。pcntl_wait的作用是掛起當前程序,直到乙個子程序中止。
<?php
//配合pcntl_signal使用
declare(ticks=1);
//最大的子程序數量
$max = 5;
//當前的子程序數量
$child = 0;
//當子程序退出時,會觸發該函式
function sig_handler($sig) }
//註冊子程序退出時呼叫的函式
pcntl_signal(sigchld, "sig_handler");
while(true)
} else
}
上面這段**就是保證有5個子程序一直在幹活,如果$child數量大於$max,就等子程序結束後再繼續執行。子程序結束後會呼叫 sig_handler函式,sig_handler會將$child數量減1,那邊while繼續執行。
popen會建立乙個管道來連線該程序,然後使用fread/fgets/stream_get_contents來讀取該程序返回的結果。跟 exec或system之類的函式不同的是,exec會等待命令執行完成,再執行下面的**,但popen不會。proc_open又更加強大一些,支援 stdin和stdout,路徑設定等等。
因為這些函式只負責建立,沒有相應的管理方法,所以只能在php檔案內部自己來實現。
demo(引用自張宴——php多程序併發控制的測試用例)
<?php
function run($input)
$p_number = $p_number - 1;
$out = popen("/bin/sh /opt/zhangyan.sh \"\" &", "r");
pclose($out);}
function worker_processes($p_number)
}return $p_number;}
$input = ""; //模擬從佇列檔案中讀取到的資料
for ($i = 1; $i <= 1000; $i++)
?>
程式的邏輯:
1. 設定/opt/zhangyan.php最多允許生成500個子程序;
2. 當/opt/zhangyan.php讀取到一條資料後,將允許生成的子程序數減1(空閒程序數$p_number=500-1=499),然後將資料交給/opt/zhangyan.sh去後台處理,不等待/opt/zhangyan.sh處理結束,繼續讀取下一條資料;
3. 當允許生成的子程序數減至0時(空閒程序數$p_number=0),/opt/zhangyan.php會等待1秒鐘,然後檢查後台還有多少個/opt /zhangyan.sh子程序尚未處理結束;
4. 如果1秒鐘之後/opt/zhangyan.php發現後台的/opt /zhangyan.sh子程序數還是500(空閒程序數$p_number=0),會繼續等待1秒鐘,如此反覆;
5. 如果/opt /zhangyan.php發現後台尚未處理結束的/opt/zhangyan.sh子程序數減少到300個了(空閒程序數$p_number=500-300=200),那麼/opt/zhangyan.php會再往後臺推送200個/opt/zhangyan.sh子程序;
總體來說還是使用pcntl_*系函式更方便一些,邏輯也更清楚。
--eof--
PHP的多程序
一般有兩種方法,一種是使用php自帶的pcntl 函式 僅限linux 另一種就是使用popen proc open,然後在php內部控制程序數量。php提供了一系列的pcntl 函式,顧名思義就是process control functions,專門用來管理程序的。最常用的就是pcntl for...
PHP多程序 4 內部多程序
說的都是只相容unix 伺服器的多程序,下面來講講在window 和 unix 都相容的多程序 這裡是泛指,下面的curl實際上是通過io復用實現的 通過擴充套件實現多執行緒的典型例子是curl,curl 支援多執行緒的抓取網頁的功能。這部分過於抽象,所以,我先給出乙個curl並行抓取多個網頁內容的...
PHP多程序 四 內部多程序
上面乙個系列的教程 用 socket 和 pcntl 實現乙個多程序伺服器 一 php多程序程式設計 一 php多程序程式設計 二 管道通訊 php多程序程式設計 三 多程序抓取網頁的演示 說的都是只相容unix 伺服器的多程序,下面來講講在window 和 unix 都相容的多程序 這裡是泛指,下...