摘要:多進程消費模型父進程等待并控制子進程的退出思路整理父進程開啟后,直接獲取到子進程的,然后存入數(shù)組,子進程出來后直接開啟業(yè)務(wù)消費代碼,然后退出,然后父進程等待子進程退出,全部退出后父進程結(jié)束代碼請在模式下運行子進程的數(shù)量如果是資源類型的變量,
多進程消費模型
父進程等待并控制子進程的退出思路整理
父進程開啟后,直接獲取到子進程的pid,然后存入child數(shù)組,子進程fork出來后直接開啟業(yè)務(wù)消費代碼,然后exit(0)退出,然后父進程pcntl_wait等待子進程退出,全部退出后父進程結(jié)束代碼
const NEWLINE = " "; if (strtolower(php_sapi_name()) != "cli") { die("請在cli模式下運行"); } $bizPath = "./childBiz/"; if (!is_dir($bizPath)) { @mkdir($bizPath, 0755, true); } $child = []; $index = 0; $loop = 10; //子進程的數(shù)量 //如果是資源類型的變量,父子進程會共享 //$f = fopen("./pcntl_fork_2.php", "r"); while ($index < $loop) { echo "當前進程:" . getmypid() . NEWLINE; $pid = pcntl_fork(); //fork出子進程 //fork后父進程會走自己的邏輯,子進程從處開始走自己的邏輯,堆棧信息會完全復(fù)制給子進程內(nèi)存空間,父子進程相互獨立 if ($pid == -1) { // 創(chuàng)建錯誤,返回-1 die("進程fork失敗"); } else if ($pid) { // $pid > 0, 如果fork成功,返回子進程id //獲取創(chuàng)建的子進程 $child[$pid] = $pid; echo "{$pid} child create!" . microtime(true) . NEWLINE; } else { // $pid = 0 // 子進程邏輯 $sleepTime = rand(5, 18); sleep($sleepTime); $time = microtime(true); file_put_contents($bizPath.getmypid().".log", $time . ":" . $index . PHP_EOL, FILE_APPEND); exit(0); } $index++; } while (count($child)) { //阻塞等待 $pid = pcntl_wait($status); $time = microtime(true); file_put_contents("./father.log", $time . ":" . $pid . ":" . $status . PHP_EOL, FILE_APPEND); if ($pid > 0) { unset($child[$pid]); } if ($pid == -1) { unset($child); } // foreach ($child as $k => $pid) { // //不阻塞循環(huán)判斷 WNOHANG表示如果沒有子進程退出立刻返回 // $res = pcntl_waitpid($pid, $status, WNOHANG); // $time = microtime(true); // file_put_contents("./father.log", $time . ":" . $pid . ":" . $res . ":" . $status . PHP_EOL, FILE_APPEND); // if (-1 == $res || $res > 0) { // unset($child[$k]); // } // } } //fclose($f); //主進程退出 exit(0);
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/28820.html
摘要:說明函數(shù)創(chuàng)建一個子進程,這個子進程僅進程號和父進程號與其父進程不同。返回值成功時,在父進程執(zhí)行線程內(nèi)返回產(chǎn)生的子進程的,在子進程執(zhí)行線程內(nèi)返回。失敗時,在父進程上下文返回,不會創(chuàng)建子進程,并且會引發(fā)一個錯誤。 pcntl 簡介 PHP的進程控制支持實現(xiàn)了Unix方式的進程創(chuàng)建, 程序執(zhí)行, 信號處理以及進程的中斷。 進程控制不能被應(yīng)用在Web服務(wù)器環(huán)境,當其被用于Web服務(wù)環(huán)境時可能會...
摘要:簡介來源官方等待或返回的子進程狀態(tài)函數(shù)刮起當前進程的執(zhí)行直到一個子進程退出或接收到一個信號要求中斷當前進程或調(diào)用一個信號處理函數(shù)。子進程使用的所有系統(tǒng)資源將被釋放。子進程已經(jīng)退出并且其狀態(tài)未報告時返回。 pcntl_wait 簡介 # 來源官方 pcntl_wait — 等待或返回fork的子進程狀態(tài) int pcntl_wait ( int &$status [, int $op...
摘要:大家知道,一個消息隊列處理系統(tǒng)主要分為兩大部分消費者和生產(chǎn)者。任務(wù)系統(tǒng)實時的對任務(wù)隊列進行,出來一個任務(wù)就一個子進程,由子進程完成具體的任務(wù)邏輯。新的設(shè)計為了解決并發(fā)的問題,我們計劃做一個更加高效強壯的隊里處理系統(tǒng)。 背景 由于PHP不支持多線程,但是作為一個完善的系統(tǒng),有很多操作都是需要異步完成的。為了完成這些異步操作,我們做了一個基于Redis隊列任務(wù)系統(tǒng)。 大家知道,一個消息隊列...
摘要:代碼實現(xiàn)啟動啟動流程見流程,主要包括守護進程保存注冊信號處理器創(chuàng)建多進程這部分。模擬調(diào)度實際用實現(xiàn)捕獲信號其中,會在每次調(diào)度過程中,捕獲信號并執(zhí)行注冊的信號處理器。 首發(fā)于 樊浩柏科學院 經(jīng)過 用 PHP 玩轉(zhuǎn)進程之一 — 基礎(chǔ) 的回顧復(fù)習,我們已經(jīng)掌握了進程的基礎(chǔ)知識,現(xiàn)在可以嘗試用 PHP 做一些簡單的進程控制和管理,來加深我們對進程的理解。接下來,我將用多進程模型實現(xiàn)一個簡單的...
摘要:在版本中我們將的進程管理模塊封裝成了類,現(xiàn)在可以在代碼中使用的進程管理器了。提供的進程管理器來自于,經(jīng)過大量生產(chǎn)項目驗證,穩(wěn)定性和健壯性都非常高。三任務(wù)投遞進程管理器自帶了消息隊列和消息投遞的支持。 在Swoole-2.1.2版本中我們將Server的進程管理模塊封裝成了PHP類,現(xiàn)在可以在PHP代碼中使用Swoole的進程管理器了。 在實際項目中經(jīng)常需要寫一些長期運行的腳本,如基于r...
閱讀 3444·2021-10-21 17:50
閱讀 3359·2021-10-08 10:05
閱讀 3571·2021-09-22 15:04
閱讀 670·2019-08-30 14:00
閱讀 2064·2019-08-29 17:01
閱讀 1593·2019-08-29 15:16
閱讀 3314·2019-08-26 13:25
閱讀 938·2019-08-26 11:44