PHP多程序處理並行處理任務例項

2021-07-03 23:59:18 字數 1968 閱讀 1683

本文目的

本文通過例子講解linux環境下,使用php進行併發任務處理,以及如何通過pipe用於程序間的資料同步。寫得比較簡單,作為備忘錄。

php多程序

通過pcntl_***系列函式使用多程序功能。注意:pcntl_***只能執行在php cli(命令列)環境下,在web伺服器環境下,會出現無法預期的結果,請慎用!

管道pipe

管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然後程序b從管道p中讀取資料。php提供的管道操作api與操作檔案的api基本一樣,除了建立管道使用posix_mkfifo函式,讀寫等操作均與檔案操作函式相同。當然,你可以直接使用檔案模擬管道,但是那樣無法使用管道的特性了。

殭屍程序

子程序結束時,父程序沒有等待它(通過呼叫wait或者waitpid),那麼子程序結束後不會釋放所有資源(浪費呀!),這種程序被稱為殭屍程序,他裡面存放了子程序結束時的相關資料,如果殭屍程序過多,會占用大量系統資源(如記憶體),影響機器效能。**

廢話少說直接上**

/**

* this is a demo for php fork and pipe usage. fork use

* to create child process and pipe is used to sychoroize

* the child process and its main process.

* @author bourneli

* @date: 2012-7-6

*/ define("pc", 10); // 程序個數

define("to", 4); // 超時

define("ts", 4); // 事件跨度,用於模擬任務延時

if (!function_exists('pcntl_fork'))

// 建立管道

$spipepath = "my_pipe.".posix_getpid();

if (!posix_mkfifo($spipepath, 0666)) error");}

// 模擬任務併發

for ($i = 0; $i < pc; ++$i ) }

// 父程序

$or = fopen($spipepath, 'r');

stream_set_blocking($or, false); // 將管道設定為非堵塞,用於適應超時機制

$sdata = ''; // 存放管道中的資料

$nline = 0;

$nstart = time();

while ($nline < pc && (time() - $nstart) < to)

echo "current line: \n";

// 用於分析多少任務處理完畢,通過『\n』標識

foreach(str_split($sline) as $c)

}$sdata .= $sline;

}echo "final line count:$nline\n";

fclose($or);

unlink($spipepath); // 刪除管道,已經沒有作用了

// 等待子程序執行完畢,避免殭屍程序

$n = 0;

while ($n < pc) exit\n";

++$n;

}} // 驗證結果,主要檢視結果中是否每個任務都完成了

$arr2 = array();

foreach(explode("\n", $sdata) as $i)

}$arr2 = array_unique($arr2);

if ( count($arr2) == pc) else

ok,完畢,注釋寫的比較清除,執行結果如下:

PHP多程序處理任務

系統 linux php 4 4.1.0,php 5,php 7 擴充套件 pcntlposixphp 多程序一般應用在 php cli 命令列中執行 php 指令碼,不要在 web 訪問時使用。多程序處理分解任務一般要比單程序更快。php 檢視是否安裝多程序模組 pcntl 是 process c...

PHP 多程序處理任務

乙個 php 多程序簡單例子大概是這個樣子 5 個子程序處理任務 for i 0 i 5 i elseif pid else 等待子程序執行結束 while pcntl waitpid 0 status 1 當然實際應用中我們不能夠這樣輸出 不夠健壯,也不夠優雅,我所以找了個基於pcntl封裝的擴充...

php利用多程序處理任務

注 php多程序一般應用在php cli命令列中執行php指令碼,做程序任務時要檢查php是否開啟了pcntl擴充套件,pcntl是process control程序管理的縮寫 pcntl fork 在當前程序當前位置產生分支 子程序 乙個fork子程序的基礎示例 pid pcntl fork 父程...