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對象裏,讓
一周排行
  • redis是一種數據存儲結構了,下文小編來介紹redis的備份和還原哦,希望此文章可以幫助到各位同學哦.edis的備份和還原,借助了第三方的工具,redis-dump1,安裝redis-dump 代碼如下 [root
  • 如果程序中沒有設置session的過期時間,那麽session過期時間就會按照IIS設置的過期時間來執行,IIS中session默認過期時間爲20分鍾,IIS中session時間可以更改如果程序中設置了session ...
  • 本文章給各位同學介紹一款asp.net C#使用SMTP發送附件程序,希望此教程對大家會有所幫助.幾年前有股學C#的熱情,寫下了C#發送郵件和C#發送帶附件的郵件文章,放到baidu上.之前有有放到ttlsa上,但是
  • 本文章介紹了關于iOS Programming 觸摸事件處理詳解有需要的同學可以參考一下iphone/ipad無鍵盤的設計是爲螢幕爭取更多的顯示空間,大螢幕在觀看圖片.文字.視頻等方面爲用戶帶來了更好的用戶體驗.而觸 ...
  • iPad3怎麽升級iOS8.2iPad3升級iOS8.2的方法圖解
    iPad3怎麽升級iOS8.2呢?ios8.2雖然目前官方還沒有出來但一聚教程小編知道這款
  • 下面我來給大家分享一篇關于Javascript的Attribute和setAttribute用法教程,希望文章給您帶來幫助.首先講講setAttribute,我們經常需要在JavaScript中給Element動態添
  • 這裏提供一款自定義select皮膚的三級聯動下拉菜單效果,把select下拉框定義的非常漂亮,有需要的朋友可以參考一下. 代碼如下 <!DOCTYPE html PUBLIC "-//W3C//DTD ...
  • 本文章來給各位同學介紹一下關于css屬性transparent不透明問題解析,如果你碰到transparent有時候並不是透明的話可參考此方法來解決.透明往往能産生不錯的網頁視覺效果,先奉上兼容主流浏覽器的CSS透明
  • 利用RowDeleted事件捕捉SQL錯誤(c#)<%@ Page Language="C#" %><!DOCTYPE html PUBLIC "-//W3C//DTD ...
  • 小時代手遊2-8/2-7/2-5五星搭配通關攻略
    小時代手遊出了很多的關卡了第一個關卡的搭配是不一樣的,下面我們就來看看小時代手遊/2 ...