PHP的多程序

2021-09-30 10:55:24 字數 1904 閱讀 4246

一般有兩種方法,一種是使用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 都相容的多程序 這裡是泛指,下...