一、php中pcntl_fork函數(shù)概述
pcntl_fork()函數(shù)是php中用于創(chuàng)建子進(jìn)程的一個函數(shù),返回創(chuàng)建的子進(jìn)程的pid。
該函數(shù)創(chuàng)建子進(jìn)程具體fork的過程:
(1)調(diào)用該函數(shù)即創(chuàng)建一個子進(jìn)程,創(chuàng)建成功父進(jìn)程返回子進(jìn)程的pid,子進(jìn)程返回0;
(2)創(chuàng)建子進(jìn)程實際上對父進(jìn)程的一個拷貝,共享代碼空間,拷貝父進(jìn)程的數(shù)據(jù),也就是說父進(jìn)程改變父進(jìn)程的數(shù)據(jù),子進(jìn)程改變子進(jìn)程的數(shù)據(jù)變量等;
二、示例代碼分析
代碼示例:
?php
$curr_pid = posix_getpid();//獲取當(dāng)前的進(jìn)程id
//將當(dāng)前進(jìn)程的id寫入文件中
echo '當(dāng)前進(jìn)程:'.$curr_pid.PHP_EOL;
//開始創(chuàng)建子進(jìn)程
$son_pid = pcntl_fork();//返回子進(jìn)程的id
//查看當(dāng)前進(jìn)程
echo '創(chuàng)建子進(jìn)程之后當(dāng)前的進(jìn)程為:'.posix_getpid().PHP_EOL;
//創(chuàng)建了子進(jìn)程之后
if($son_pid > 0){
echo '子進(jìn)程id:'.$son_pid.PHP_EOL;
}
以上代碼執(zhí)行后結(jié)果為:
示例代碼分析:
(1)發(fā)現(xiàn)創(chuàng)建了子進(jìn)程之后,系統(tǒng)會切換到子進(jìn)程中,而子進(jìn)程中的代碼是從含有pcntl_fork函數(shù)的那行執(zhí)行的
(2)創(chuàng)建子進(jìn)程之后,子進(jìn)程的代碼段是拷貝pcntl_fork函數(shù)及之后的代碼段,之前的代碼段并不拷貝,但是具體的數(shù)據(jù)變量子進(jìn)程仍然會拷貝
(3)可見,fork之后程序會分叉執(zhí)行,即子進(jìn)程執(zhí)行
三、pcntl_fork的業(yè)務(wù)場景舉例
- php的多進(jìn)程中,常用pcntl_fork來實現(xiàn)并發(fā),多用于一些簡單工具的實現(xiàn)。
- 例如監(jiān)控工具,想要監(jiān)控幾個不同指標(biāo)的情形,可以使用主進(jìn)程監(jiān)控各指標(biāo)的配置變化,然后對每個指標(biāo)分別fork一個子進(jìn)程來監(jiān)控其具體的情形,當(dāng)主進(jìn)程發(fā)現(xiàn)指標(biāo)的配置改變則kill掉之前的子進(jìn)程重新創(chuàng)建子進(jìn)程進(jìn)行監(jiān)控。
- 主進(jìn)程進(jìn)行業(yè)務(wù)分發(fā)操作,子進(jìn)程進(jìn)行具體的業(yè)務(wù)邏輯執(zhí)行。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:- PHP多進(jìn)程之pcntl_fork的實例詳解
- PHP使用pcntl_fork實現(xiàn)多進(jìn)程下載圖片的方法
- php pcntl_fork和pcntl_fork 的用法
- php中unable to fork報錯簡單解決方法