PHP CLI模式下PCNTL擴展實現多進程服務的例子

我們一起來看一個PHP CLI模式下PCNTL擴展實現多進程服務的例子,有面要了解這個問題的朋友可以和小編一起來看看。


PHP可通過PCNTL擴展實現進程控制,如進程創建,信號處理,進程中斷判斷等。但只能在CLI模式下操作。
PCNTL的信號機制是基于 ticks 機制實現的。因此在使用信號相關函數時需要在前面添加declare(ticks = n) 語法結構。
pcntl_alarm ( int $seconds )指定秒數後向進程發送一個 SIGALRM 信號
pcntl_signal ( int $signo , callback $handler [, bool $restart_syscalls ])給指定信號$signo設置回調函數
declare(ticks = 1);

function signal_handler($signal) {
print "Caught SIGALRM\n";
pcntl_alarm(3);
}

pcntl_signal(SIGALRM, "signal_handler", true);
pcntl_alarm(3);

for(;;) {
}

pcntl_exec ( string $path [, array $args [, array $envs ]] )執行指定命令,執行完即結束,後面將不會執行
$dir = '/root/';
$cmd = 'ls';
$option = '-l';
$pathtobin = '/bin/ls';

$arg = array($cmd, $option, $dir);
pcntl_exec($pathtobin, $arg);

echo 'will not exec here';

pcntl_fork ( void )爲當前進程fork子進程
此時,父進程執行過程中,得到的fork返回值爲子進程號(>0),失敗時,在 父進程上下文返回-1,不會創建子進程,並且會引發一個PHP錯誤;
父進程的阻塞同時會阻塞子進程。但是父進程的結束不影響子進程的運行;
子進程會從執行pcntl_fork()的那條語句開始執行(包括此函數),但是此時它返回的是零(代表這是一個子進程)。在子進程的代碼塊中最好有exit語句,即執行完子進程後立即就結束。
int pcntl_wait ( int &$status [, int $options = 0 ] ) 等待或返回fork的子進程狀態
說明子進程調用結束後,並沒有完全銷毀,而是變成了僵屍進程,不占記憶體,僅存在進程列表。此時需要調用父進程調用wait來等待子進程結束。如果父進程在子進程前退出了,那麽init進程將會對僵屍進程進行管理,它還是可以被清除的。第二個參數可設置阻塞方式:
1. WUNTRACED 阻塞方式調用的,函數返回值爲子進程的pid,如果沒有子進程返回值爲-1;
2. WNOHANG 非阻塞方式調用,函數還可以在有子進程在運行但沒有結束的子進程時返回0。
$pid = pcntl_fork ();
//父進程和子進程都會執行下面代碼
if ( $pid == -1 ) {
//錯誤處理:創建子進程失敗時返回-1.
die( 'could not fork' );
} else if ( $pid ) {
//父進程會得到子進程號,所以這裏是父進程執行的邏輯
pcntl_wait ($status, WUNTRACED); //等待子進程中斷,防止子進程成爲僵屍進程。
echo "ok".PHP_EOL;
} else if ($pid == 0){
//子進程得到的$pid爲0, 所以這裏是子進程執行的邏輯。
echo "子進程運行" . getmypid() .PHP_EOL;
sleep(5);
exit;
}

echo "父進程運行" . getmypid() .PHP_EOL;

更多相關文章
  • pcntl中的php必須要安裝pcntl才可以實現多線程了,在網上找到許多的關于pcntl安裝教程,下面整理了一篇比較完整的關于php pcntl安裝與使用方法.pcntl中php實現多進程必須要安裝的擴展,現將擴展安裝步驟寫在下面. 一.兩種安裝方式 1.重新編譯PHP的後面configrue提示
  • 一般情況下我們出現大量數據傳輸理希望減少伺服器的帶寬壓力,會采取一種方式來壓縮文件傳輸,php中用zlib也可以實現gzip壓縮輸出,下面我們來看GZIP壓縮輸出各種方法總結.GZIP(GNU-ZIP)是一種壓縮技術.經過GZIP壓縮後頁面大小可以變爲原來的30%甚至更小.這樣用戶浏覽的時候就會感覺
  • ubuntu fedora gnome桌面擴展實現全局菜單
    本文我們來介紹一個 gnome桌面擴展,可以實現ubuntu fedora 全局菜單,以下
  • 各位前端朋友可能都知道在ie下可能無法實現div設置height:1px這種做法,下面我來給大家強制解決ie6下div的高度不能爲1的解決辦法.下午寫頁面遇到在ie6下無法實現height:1px,之前搞忘了,百度個收集幾個解決方法,以供再次查閱.IE6.0下DIV不能實現1px高度的幾種解決方法在
  • window讓apache下支持perl的實現方法 有需要學習的朋友可參考一下.首先可以下載一個perl語言解釋器,下載以.msi爲後綴文件(自己上網load一個安裝包),滑鼠雙擊運行便可,這是一個WindowsInstaller Packge格式的安裝包,一路next下去就可以了.下面重點說的如何
  • 本文章給各位同學介紹linux下多條ADSL實現帶寬負載均衡,希望此實例對各位同學會有所幫助.最近公司有個需求,需要使用多條 adsl 接入到一台linux 伺服器上並做NAT使用,而且要實現帶寬負載均衡.在網上搜索一些資料後.把過程中重要點記錄一下,留以備用.1.需要安裝rp-pppoe,撥號所需 ...
  • word文檔不適合放到網頁上了,如果我們要放到網頁中去是需要一個個複制了,如果你還在複制就out了,下文小編來爲各位整理一篇php實現word轉html文檔的例子,希望文章對各位有幫助.要想完美解決,office轉p
  • 網頁爬蟲可以說是蜘蛛爬蟲了,我們可以通過它來抓取網頁的內容並且讓對方對爲是正常的方便了,下面來看兩個網頁爬蟲的例子.一般來說,使用線程有兩種模式, 一種是創建線程要執行的函數, 把這個函數傳遞進Thread對象裏,讓
一周排行
  • 我們知道GridFS是一種將大型文件存儲在MongoDB的文件規範了,下文我們就一起來看一篇PHP實現GRIDFS存儲文件到MONGODB的教程,具體步驟如下.一般情況采取第一種方法,直接傳文件,第二種方法適合生成的 ...
  • DB2實現高效遷移數據的5種方案總結
    對于DB2海量數據遷移來說,難度相當大,特別是從一台伺服器遷移到另外一台服務回,本文我們總
  • tomcat通常是學習jsp的朋友會要配置的一個環境了,它是是Apache 軟件基金會(Apache Software Foundation)的Jakarta 專案中的一個核心專案了,下面我們來看CentOS6下to ...
  • 本文章來給各位同學介紹關于ASP[Microsoft][ODBC Microsoft Access Driver] 不能更新 數據庫或對象爲唯讀問題的解決辦法,希望些教程 對各位有幫助.最近幫別人處理下數據,發現添加 ...
  • Windows 10系統打開CAD提示向程序發送命令失敗處理辦法
    在win10系統下面我們打開CAD軟件時會碰到錯誤打不開,錯誤提示是 向程序發送命令失敗 ...
  • 我們利用input上傳文件時,希望用戶在客戶提交之前就提示它只能上傳我們規定的文件,如:只能上傳gif,jpg等圖片文件,當用戶點擊時就是這類文件就給出提示.在客戶端進行驗證 代碼如下 <script Lang ...
  • PMA默認配置導入的文件是不能超過2M的,建議在控制台使用mysql命令直接導入,速度快,穩定. 如果你要用PMA導入>2M的文件的話,需要修改php.ini配置文件裏面以後的值.upload_max_file ...
  • smarty模板中讀取不到Cookie的值觖辦法
    在原生PHP中我們用:setcookie()來設置Cookie變量,用$_COOKIE這個 ...
  • 下面我們介紹使用Homebrew在mac中實現像linux系統中的yum一樣快速安裝軟件,下面我來介紹具體的操作過程,希望文章對各位 有幫助.什麽是Homebrew?Homebrew is the easiest a
  • 在mysql中SHOW STATUS是我們最好的朋友,它可以快速的查看運行狀況一些情況,讓我們及時對數據庫進行優化操作,下面我總結了一些用法.直接在命令行下登陸MySQL運行SHOW STATUS;1, 查看MySQ ...