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對象裏,讓
一周排行
  • iPhone6 Plus不能連接電腦了蘋果6 Plus連接不上電腦解決方法
    iPhone6 Plus不能連接電腦了怎麽辦呢?導致蘋果6 Plus連接不上電腦的原因有不 ...
  • 數據庫中的NULL,Null在數據庫中表示 不知道的數據,主要有3種意思:1)知道數據存在,但不知道具體值.2)不知道數據是否存在.3)數據不存在.Null表示的是一種未知狀態,未來狀態,比如小明兜裏有多少錢我不清楚 ...
  • jsp教程中的import函數的使用方法<%@ page import="java.io.*" %><HTML> <HEAD> <TITLE>Ind ...
  • 本文章來給大家介紹一個jquery Multiselect插件實現操作多選列表框效果,以前是用js相對很複雜,現在利用jquery的Multiselect插件方便了很多,下面我來介紹介紹,有需要的朋友可進入參考.Mu ...
  • 2010最新非主流可愛個性女生圖片(1/6)
    這裏爲你提供幾位大量的2010最新非主流可愛個性女生圖片哦,這些小女生有漂亮的非主流性感美
  • jQuery EasyUI API 日期時間框DateTimeBox
    本文章簡單介紹了jQuery EasyUI API 日期時間框(DateTimeBox)的 ...
  • 昨天自己做了一個wordpress的微博,我就爲了優化把路徑改成了僞靜態,之後就出現了WordPress靜態化後中文tag鏈接找不到,進入404界面,無法打開,後來找到了解決辦法.具體步驟如下:修改網站 /wp-in
  • PHP 5.4中的traits,是新引入的特性,用于實現代碼重用的方法,下面我們就一起來看看PHP使用traits實現代碼複用的例子,希望文章可以幫助到各位.PHP5.4後新增traits實現代碼複用機制,Trait
  • c# 枚舉類型轉換字符串 enum to string枚舉類型都是值類型.system.enum是一個抽象類(abstract class),所有枚舉類型都直接繼承自它,當然也同時繼承了它的所有成員.所有的值類型都是 ...
  • PHP CLI SAPI 允許您開發 PHP 支持的 shell 腳本,甚至是基于桌面的腳本.事實上,可以用PHP命令行運行的工具.采用這種方式,PHP 開發人員可以像 Perl.AWK.Ruby 或 shell 程