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