這篇文章主要介紹了PHP多進程程式設計方法,較為詳細的分析了PHP多進程程式設計的概念、用法、相關函數與使用技巧,需要的朋友可以參考下
本文實例講述了PHP多進程程式設計。分享給大家參考,具體如下:
第一步:
$ php -m 指令查看php是否安裝pcntl 和posix擴展,若沒有則安裝
使用場景:
1. 要進行大量的網路耗時的操作
2. 要做大量的運算,並且,系統有多個cpu ,為了讓使用者有更快的體驗,把一個任務,分成幾個小任務,最後再合併。
多重進程常用函數:
pcntl_alarm — 為進程設定一個alarm鬧鐘訊號
pcntl_errno — 別名pcntl_strerror
pcntl_exec — 在目前進程空間執行指定程式
pcntl_fork — 建立子進程,在目前進程目前位置產生分支(子進程)。譯註:fork是創建了一個子進程,父進程和子進程都從fork的位置開始向下繼續執行,不同的是父進程執行過程中,得到的fork返回值為子進程號,而子進程得到的是0。
pcntl_get_last_error — Retrieve the error number set by the last pcntl function which failed
pcntl_getpriority — 取得任意行程的優先權
pcntl_setpriority# — 修改任意程序的優先權
pcntl_signal_dispatch — 呼叫等待訊號的處理器
pcntl_signal — 安裝一個訊號處理器
pcntl_sigprocmask — 設定或擷取阻塞訊號
pcntl_sigtimedwait — 具有逾時機制的訊號等待
pcntl_sigwaitinfo — 等待訊號
pcntl_strerror — Retrieve the system error message associated with the given errno
pcntl_wait — 等待或傳回fork的子進程狀態
pcntl_waitpid — 等待或傳回fork的子進程狀態
######################################################## #pcntl_wexitstatus### — 傳回中斷的子程序的回傳代碼######pcntl_wifexited### — 檢查狀態代碼是否代表一個正常的退出。 ######pcntl_wifsignaled### — 檢查子進程狀態碼是否代表由於某個訊號而中斷######pcntl_wifstopped### — 檢查子進程目前是否已經停止######pcntl_wstopsig# ## — 傳回導致子程序停止的訊號######pcntl_wtermsig### — 傳回導致子程序中斷的訊號#########實例一:########### #####
<?php //最早的进程,也是父进程 $parentPid = getmypid(); echo '原始父进程:' . $parentPid . PHP_EOL; //创建子进程,返回子进程id $pid = pcntl_fork(); if( $pid == -1 ){ exit("fork error"); } //pcntl_fork 后,父进程返回子进程id,子进程返回0 echo 'ID : ' . $pid . PHP_EOL; if( $pid == 0 ){ //子进程执行pcntl_fork的时候,pid总是0,并且不会再fork出新的进程 $mypid = getmypid(); // 用getmypid()函数获取当前进程的PID echo 'I am child process. My PID is ' . $mypid . ' and my fathers PID is ' . $parentPid . PHP_EOL; } else { //父进程fork之后,返回的就是子进程的pid号,pid不为0 echo 'Oh my god! I am a father now! My childs PID is ' . $pid . ' and mine is ' . $parentPid . PHP_EOL; } $aa = shell_exec("ps -af | grep index.php"); echo $aa;######實例二:###開多個子程序,避免fork氾濫############
<?php //最早的进程,也是父进程 $parentPid = getmypid(); echo '原始父进程:' . $parentPid . PHP_EOL; //开启十个子进程 for($i = 0; $i < 10; $i++) { $pid = pcntl_fork(); if($pid == -1) { echo "Could not fork!\n"; exit(1); } //子进程 if(!$pid) { //child process workspace echo '子进程:' . getmypid() . PHP_EOL; exit(); //子进程逻辑执行完后,马上退出,以免往下走再fork子进程,不好控制 } else { echo '父进程:' . getmypid() . PHP_EOL; } } echo getmypid() . PHP_EOL; $aa = shell_exec("ps -af | grep index.php"); echo $aa;######注意:### ######透過pcntl_XXX系列函數使用多進程功能。注意:pcntl_XXX只能運行在php CLI(命令列)環境下,在web伺服器環境下,會出現無法預期的結果,請慎用! ###
以上是PHP多進程的實作詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!