精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入理解 PHP 高性能框架 Workerman 守護進程原理

開發 前端
守護進程顧名思義就是能夠在后臺一直運行的進程,不會霸占用戶的會話終端,脫離了終端的控制。相信朋友們對這東西都不陌生了吧?如果連這個概念都還不能理解的話,建議回爐重造多看看 Linux 進程管理相關的基礎知識。

大家好,我是碼農先森。

守護進程顧名思義就是能夠在后臺一直運行的進程,不會霸占用戶的會話終端,脫離了終端的控制。相信朋友們對這東西都不陌生了吧?如果連這個概念都還不能理解的話,建議回爐重造多看看 Linux 進程管理相關的基礎知識。在我們日常的編程中常見有類似 php think ...、php artisan ...、php yii ... 等命令啟動需要一直執行的任務,都會通過 nohup 掛載到后臺保持長期運行的狀態。同樣在 Workerman 中也是使用類似 php index.php start 的命令來啟動進程,但不同的是它不需要利用 nohup 便可以掛載到后臺運行。那有些朋友就會好奇它是怎么實現的呢?為了解決朋友們的疑惑,我們今天就重點深入分析一下 Workerman 守護進程的實現原理。

我們先了解一些進程相關的知識:

  • 父進程:父進程是生成其他進程的進程。當一個進程創建了另一個進程時,創建者被稱為父進程,而被創建的進程則成為子進程。父進程可以通過進程標識符(PID)來識別它所創建的子進程。
  • 子進程:子進程是由父進程創建的新進程。子進程繼承了父進程的一些屬性,例如環境變量、文件描述符等。子進程獨立于父進程運行,它可以執行自己的代碼,并且具有自己的資源和內存空間。
  • 進程組:進程組是一組相關聯的進程的集合。每個進程組都有一個唯一的進程組ID(PGID),用于標識該進程組。進程組通常由一個父進程創建,并且包含了與父進程具有相同會話ID(SID)的所有子進程。
  • 會話:會話是一組關聯進程的集合,通常由用戶登錄到系統開始,直至用戶注銷或關閉終端會話結束,一個會話中的進程共享相同的控制終端。每個會話都有一個唯一的會話ID(SID),用于標識該會話。會話通常包含一個或多個進程組,其中第一個進程組成為會話的主進程組。

這些概念俗稱八股文,向來都不怎么好理解,那我們來看個例子。執行了命令 php index.php 便產生了進程 61052「該進程的父進程是 Bash 進程 8243,這里不用管它」,然后通過 Fork 創建了子進程 61053 且其父進程就是 61052,這兩個進程擁有共同的進程組 61052 和會話 8243。調用 posix_setsid 函數,將會為子進程 61053 開啟新的進程組 61053 和新的會話 61053,這里的會話可以理解為一個新的命令窗口終端。最后子進程 61053 通過 Fork 創建了子進程 61054,進程 61053 升級成了父進程,這里再次 Fork 的原因是要避免被終端控制進程所關聯,這個進程 61052 是在終端的模式下創建的,自此進程 61054 就形成了守護進程。

[manongsen@root phpwork]$ php index.php
[parent] 進程ID: 61052, 父進程ID: 8243, 進程組ID: 61052, 會話ID: 8243 
[parent1] 進程ID: 61052, 父進程ID: 8243, 進程組ID: 61052, 會話ID: 8243 退出了該進程
[child1] 進程ID: 61053, 父進程ID: 61052, 進程組ID: 61052, 會話ID: 8243 
[child1] 進程ID: 61053, 父進程ID: 61052, 進程組ID: 61053, 會話ID: 61053 
[parent2] 進程ID: 61053, 父進程ID: 61052, 進程組ID: 61053, 會話ID: 61053 退出了該進程
[child2] 進程ID: 61054, 父進程ID: 61053, 進程組ID: 61053, 會話ID: 61053 保留了該進程

[manongsen@root phpwork]$ ps aux | grep index.php
root             66064   0.0  0.0 408105040   1472 s080  S+   10:00下午   0:00.00 grep index.php
root             61054   0.0  0.0 438073488    280   ??  S    10:00下午   0:00.00 php index.php

上面舉例的進程信息,正是這段代碼運行所產生的。如果看了這段代碼且細心的朋友,會發現為什么 posix_setsid 這個函數不放在第一次 Fork 前調用,而在第二次 Fork 前調用呢,這樣的話就不用 Fork 兩次了?原因是組長進程是不能創建會話的,進程組ID 61052 和進程ID 61052 相同「即當前進程則為組長進程」,所以需要子進程來創建新的會話,這一點需要特別注意一下。

<?php

function echoMsg($prefix, $suffix="") {
    // 進程ID
    $pid = getmypid(); 
    // 進程組ID
    $pgid = posix_getpgid($pid);
    // 會話ID
    $sid = posix_getsid($pid); 
    // 父進程ID
    $ppid = posix_getppid();

    echo "[{$prefix}] 進程ID: {$pid}, 父進程ID: {$ppid}, 進程組ID: {$pgid}, 會話ID: {$sid} {$suffix}" . PHP_EOL;
}

// [parent] 進程ID: 61052, 父進程ID: 8243, 進程組ID: 61052, 會話ID: 8243
echoMsg("parent");

// 第一次 Fork 進程  
$pid = pcntl_fork();
if ( $pid < 0 ) {
    exit('fork error');
} else if( $pid > 0 ) {
    // [parent1] 進程ID: 61052, 父進程ID: 8243, 進程組ID: 61052, 會話ID: 8243 退出了該進程
    echoMsg("parent1", "退出了該進程");
    exit;
}

// 創建的 子進程ID 為 61053 但 進程組、會話 還是和父進程是同一個
// [child1] 進程ID: 61053, 父進程ID: 61052, 進程組ID: 61052, 會話ID: 8243 
echoMsg("child1");

// 調用 posix_setsid 函數,會創建一個新的會話和進程組,并設置 進程組ID 和 會話ID 為該 進程ID
if (-1 === \posix_setsid()) {
    throw new Exception("Setsid fail");
}

// 現在會發現 進程組ID 和 會話ID 都變成了 61053 在這里相當于啟動了一個類似 Linux 終端下的會話窗口
// [child1] 進程ID: 61053, 父進程ID: 61052, 進程組ID: 61053, 會話ID: 61053 
echoMsg("child1");

// 第二次 Fork 進程
// 這里需要二次 Fork 進程的原因是避免被終端控制進程所關聯,這個進程 61052 是在終端的模式下創建的
// 需要脫離這個進程 61052 以確保守護進程的穩定
$pid = pcntl_fork();
if ( $pid  < 0 ){
    exit('fork error');
} else if( $pid > 0 ) {
    // [parent2] 進程ID: 61053, 父進程ID: 61052, 進程組ID: 61053, 會話ID: 61053 退出了該進程
    echoMsg("parent2", "退出了該進程");
    exit;
}

// 到這里該進程已經脫離了終端進程的控制,形成了守護進程
// [child2] 進程ID: 61054, 父進程ID: 61053, 進程組ID: 61053, 會話ID: 61053 保留了該進程
echoMsg("child2", "保留了該進程");

sleep(100);

有時間的朋友最好自行執行代碼并分析一遍,會有不一樣的收獲。這里假裝你已經實踐過了,這下我們來看 Workerman 的 Worker.php 文件中 554 行的 runAll 方法中的 static::daemonize() 這個函數,實現的流程邏輯和上面的例子幾乎一樣。不過這里還使用了 umask 這個函數,其主要的作用是為該進程所創建的文件或目錄賦予相應的權限,保證有權限操作文件或目錄。

// workerman/Worker.php:554
/**
 * Run all worker instances.
 * 運行進程
 * @return void
 */
public static function runAll()
{
    static::checkSapiEnv();
    static::init();
    static::parseCommand();
    static::lock();
    // 創建進程并形成守護進程
    static::daemonize();
    static::initWorkers();
    static::installSignal();
    static::saveMasterPid();
    static::lock(\LOCK_UN);
    static::displayUI();
    static::forkWorkers();
    static::resetStd();
    static::monitorWorkers();
}

// workerman/Worker.php:1262
/**
 * Run as daemon mode.
 * 使用守護進程模式運行
 * @throws Exception
 */
protected static function daemonize()
{
 // 判斷是否已經是守護狀態、以及當前系統是否是 Linux 環境
    if (!static::$daemonize || static::$_OS !== \OS_TYPE_LINUX) {
        return;
    }
    
    // 設置 umask 為 0 則當前進程創建的文件權限都為 777 擁有最高權限
    \umask(0);
    
    // 第一次創建進程
    $pid = \pcntl_fork();
    if (-1 === $pid) {
     // 創建進程失敗
        throw new Exception('Fork fail');
    } elseif ($pid > 0) {
     // 主進程退出
        exit(0);
    }

 // 子進程繼續執行...
    // 調用 posix_setsid 函數,可以讓進程脫離父進程,轉變為守護進程
    if (-1 === \posix_setsid()) {
        throw new Exception("Setsid fail");
    }

 // 第二次創建進程,在基于 System V 的系統中,通過再次 Fork 父進程退出
 // 保證形成的守護進程,不會成為會話首進程,不會擁有控制終端
    $pid = \pcntl_fork();
    if (-1 === $pid) {
     // 創建進程失敗
        throw new Exception("Fork fail");
    } elseif (0 !== $pid) {
     // 主進程退出
        exit(0);
    }

    // 子進程繼續執行...
}

守護進程也是 Workerman 中重要的一部分,它保障了 Workerman 進程的穩定性。不像我們通過 nohup 啟動的命令,掛起到后臺之后,有時還神不知鬼不覺的就掛了,朋友們或許都有這樣的經歷吧。當然在市面上也有一些開源的守護進程管理軟件,比如 supervisor 等,其次還有人利用會話終端 screen、tmux 等工具來實現。其實守護進程的實現方式有多種多樣,我們這里只是為了分析 Workerman 中守護進程的實現原理,而引出了在 PHP 中實現守護進程模式的例子,希望本次的內容能對你有所幫助。

責任編輯:武曉燕 來源: 碼農先森
相關推薦

2025-01-13 13:00:00

Go網絡框架nbio

2025-01-26 00:00:15

PHP協程控制權

2009-11-16 17:20:04

PHP多維數組排序

2024-10-21 09:06:15

2022-11-09 08:12:07

2019-04-08 16:50:33

前端性能監控

2022-11-04 09:43:05

Java線程

2024-03-12 00:00:00

Sora技術數據

2024-11-01 08:57:07

2021-03-10 10:55:51

SpringJava代碼

2022-09-05 08:39:04

kubernetesk8s

2020-08-10 18:03:54

Cache存儲器CPU

2024-04-15 00:00:00

技術Attention架構

2020-12-04 11:40:53

Linux

2025-09-09 09:32:04

2020-03-26 16:40:07

MySQL索引數據庫

2023-09-19 22:47:39

Java內存

2022-09-26 08:01:31

線程LIFO操作方式

2022-01-14 12:28:18

架構OpenFeign遠程

2019-07-01 13:34:22

vue系統數據
點贊
收藏

51CTO技術棧公眾號

性欧美大战久久久久久久免费观看| 亚洲欧洲高清在线| 国产日韩欧美大片| 亚洲精品97久久中文字幕| 亚洲免费成人| 永久免费看mv网站入口亚洲| 亚洲综合123| heyzo在线| 久久久无码精品亚洲日韩按摩| 国产剧情久久久久久| 国产一级片网址| 欧美日韩在线播放视频| 精品精品欲导航| 黄色一级免费大片| 国产网红女主播精品视频| 国产午夜精品久久久久久久 | 青青国产在线视频| 欧美成人69| 亚洲天堂av高清| 久久久久中文字幕亚洲精品| 老司机2019福利精品视频导航| 亚洲精品美腿丝袜| 五月婷婷一区| 日本中文字幕一区二区有码在线| 狠狠色丁香九九婷婷综合五月| 91精品国产沙发| 黄色一级大片在线免费观看| 夜夜春成人影院| 精品国产乱子伦一区| 91 在线视频观看| 午夜精品久久久久久久久久蜜桃| 亚洲一区在线电影| 综合视频免费看| 春暖花开成人亚洲区| 高清不卡一区二区在线| 国产精品一区=区| 亚洲自拍一区在线观看| 在线精品一区| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美一级高潮片| 一区二区在线| www亚洲欧美| 亚洲色图 激情小说| 伊人成综合网yiren22| 亚洲精品国精品久久99热 | 国产视频一区不卡| 裸模一区二区三区免费| 三级小视频在线观看| 国产成人h网站| 99国产视频| 国产jzjzjz丝袜老师水多| 久久激情综合网| 国产精品视频999| 亚洲系列在线观看| 蜜臀av一区二区在线免费观看| 国产精品黄视频| 国产主播第一页| 奇米影视7777精品一区二区| 国产精品视频1区| 亚洲一级视频在线观看| 久久超碰97中文字幕| 国产日韩欧美自拍| 国产精品无码在线播放| 国产一二三精品| av一区二区三区四区电影| 亚洲大尺度网站| av一区二区不卡| 欧美12av| 欧美成人视屏| 一区二区三区在线免费视频 | 国产又粗又黄又猛| 久久日文中文字幕乱码| 蜜月aⅴ免费一区二区三区| 亚洲天堂黄色片| 欧美精品aa| 国语对白做受69| 一级成人黄色片| 日韩成人免费电影| 91久久久久久| 欧美 日韩 中文字幕| 26uuu国产一区二区三区| 欧美一区二区三区精美影视 | 精品欧美一区二区精品少妇| 丁香五精品蜜臀久久久久99网站| 久久99精品久久久久久水蜜桃 | 午夜肉伦伦影院| 国产a亚洲精品| 日韩一区二区精品| 深爱五月激情网| 国产精品x453.com| 久久久免费电影| 久久久久久无码精品大片| 国产一区二区免费在线| 精品国产乱码久久久久| 77导航福利在线| 亚洲图片欧美一区| 男操女免费网站| 亚洲啊v在线免费视频| 亚洲欧美综合v| www.av视频| 欧美一区=区| 亚洲在线免费观看| 国产午夜精品一区理论片| 一区二区三区欧美亚洲| 日本久久精品一区二区| 91成人短视频| www.亚洲一区| www五月天com| 国产成人精品aa毛片| 一区二区免费电影| 在线中文字幕播放| 日韩区在线观看| www.黄色在线| 性8sex亚洲区入口| 99蜜桃在线观看免费视频网站| 番号集在线观看| 韩曰欧美视频免费观看| 韩国黄色一级片| 五月婷婷六月综合| 国产精品扒开腿爽爽爽视频| 天天操天天爱天天干| 亚洲色图在线看| 一区二区成人网| 深爱激情综合网| 午夜欧美不卡精品aaaaa| 国产精品一区二区黑人巨大| 国产日产欧美精品一区二区三区| 成人在线观看你懂的| 欧美高清hd| 搡老女人一区二区三区视频tv| 1级黄色大片儿| 播五月开心婷婷综合| 青青草影院在线观看| 伊人国产精品| 色偷偷亚洲男人天堂| 艳妇乳肉豪妇荡乳av无码福利 | 青青青手机在线视频| 久久精品人人做人人爽电影蜜月| 黑人另类av| 国产丝袜在线播放| 欧美电影免费提供在线观看| 精品国产视频一区二区三区| 裸体一区二区三区| 视频一区亚洲| 成人深夜福利| 日韩亚洲精品视频| 亚洲一区 中文字幕| 亚洲欧洲日韩综合一区二区| 中文字幕免费高清在线| 日韩在线视频精品| 国产一区在线播放| 国产一区久久精品| 日韩欧美中文一区二区| 欧美卡一卡二卡三| 成人黄色大片在线观看 | 亚洲男人天堂网| 麻豆成人免费视频| 国产偷国产偷精品高清尤物| 无码少妇一区二区三区芒果| 日韩欧美电影| 成人免费网站在线看| 成人在线观看免费网站| 日韩欧美国产wwwww| 久久精品国产亚洲av香蕉| 成人激情免费网站| 久久精品网站视频| 日本一区二区在线看| 成人在线观看视频网站| 欧美xxxxhdvideosex| 欧美精品一区男女天堂| av大片在线免费观看| 国产亚洲一二三区| 日本国产一级片| 黄色在线成人| 欧美日韩在线播放一区二区| 亚洲成人av观看| 九九视频直播综合网| 五月婷婷六月激情| 欧美午夜精品电影| 欧美日韩在线视频免费| wwww国产精品欧美| 男人添女人下面免费视频| 欧美人成在线| 欧美资源一区| 欧美不卡在线观看| 欧美在线欧美在线| 久久精品视频免费看| 日韩欧美亚洲国产另类| 中文字幕激情小说| 日韩美女视频19| 亚洲熟女一区二区| 美女视频网站久久| 国产av熟女一区二区三区| 国产成人ay| 97在线资源站| 在线日本欧美| 国语自产精品视频在线看抢先版图片| sese一区| 精品av综合导航| 91欧美日韩麻豆精品| 欧美日韩中文在线观看| 国产传媒免费在线观看| 久久色.com| 日本人妻一区二区三区| 久久99国产精品免费| 亚洲中文字幕无码专区| 911精品美国片911久久久| 欧美日本国产精品| silk一区二区三区精品视频| 国产精自产拍久久久久久蜜| 91www在线| 美女少妇精品视频| 午夜视频在线看| 亚洲人成网站在线播| 亚洲欧美另类一区| 欧美日本高清视频在线观看| 天天操夜夜操视频| 亚洲大片在线观看| 澳门黄色一级片| 国产精品国产三级国产aⅴ中文| 亚洲AV无码国产精品| 丰满白嫩尤物一区二区| 欧美日韩精品区别| 秋霞午夜鲁丝一区二区老狼| 免费欧美一级视频| 亚洲精品少妇| 免费人成自慰网站| 欧美91福利在线观看| 亚洲精品视频一区二区三区| 国产午夜一区| 欧美精品在线一区| 任你弄精品视频免费观看| 99久久精品久久久久久ai换脸| xxxxx.日韩| 国产精品久久久久久av下载红粉| 天堂√中文最新版在线| 国语自产精品视频在免费| 波多野结衣在线高清| 九九热在线精品视频| 国产黄色在线网站| 伦伦影院午夜日韩欧美限制| 免费人成在线观看播放视频| 日韩在线一区二区三区免费视频| 成人精品一区二区三区免费| 亚洲人成电影在线| 国产专区在线播放| 中文字幕精品av| chinese偷拍一区二区三区| 亚洲一区www| 午夜毛片在线| 精品国内产的精品视频在线观看| 日本不卡视频| 久久精品国产91精品亚洲| 麻豆影视在线观看_| 欧美成年人视频| 中文字幕有码在线观看| 久久免费视频在线观看| 日韩精品av| 国产成人免费av| 久久日本片精品aaaaa国产| 国产日韩欧美中文在线播放| 国产成人免费视频网站视频社区| 亚洲一区二区三区sesese| 亚洲1区在线观看| 国产一区二区三区av在线| 日韩精品社区| 手机看片福利永久国产日韩| 午夜精品久久久久久久四虎美女版| 中文字幕第一页亚洲| 国产精品九九| 国产精品欧美激情在线观看 | 日韩av成人网| 久久综合中文字幕| 激情高潮到大叫狂喷水| 一区二区三区国产豹纹内裤在线| 国产大片中文字幕在线观看| 欧美性感美女h网站在线观看免费| 波多野结衣网站| 欧美一区二区三区免费| 蜜臀av午夜精品| 国产一区二区三区视频在线观看 | 韩国v欧美v日本v亚洲| 在线高清av| 成人中文字幕+乱码+中文字幕| 成人资源在线播放| 日本日本精品二区免费| 亚洲精品a级片| 青青艹视频在线| 久88久久88久久久| 成人手机在线免费视频| 一区二区中文视频| 日本午夜视频在线观看| 欧美二区乱c少妇| 亚洲欧美日韩综合在线| 久久精品2019中文字幕| 日本在线啊啊| 亚洲free性xxxx护士白浆| 亚洲人成精品久久久| 亚洲成人动漫在线| 久久一二三四| 乱码一区二区三区| 国产精品久久久久久亚洲毛片| 精品久久免费视频| 欧美日韩高清在线播放| 深夜福利在线观看直播| 久久成年人免费电影| 欧洲一区二区三区精品| 粉嫩av免费一区二区三区| 经典一区二区| www.av片| 国产一区二区导航在线播放| 国产手机在线观看| 亚洲成人你懂的| 精品国产伦一区二区三| 日韩中文字幕国产精品| 国产精欧美一区二区三区蓝颜男同| 91牛牛免费视频| 日韩欧美视频专区| 无码人妻丰满熟妇区毛片18| 成人av资源在线观看| 国产性xxxx| 欧美日本韩国一区二区三区视频 | 久久成人国产精品| 国产极品嫩模在线观看91精品| 精品欧美一区二区精品久久| 欧美破处大片在线视频| 午夜一区二区视频| 国产精品高清亚洲| 伊人成年综合网| 亚洲人成电影在线播放| 偷拍自拍在线看| 国产日本一区二区三区| 国产一区二区三区四区老人| 色男人天堂av| 亚洲日本在线天堂| 国产精品久久综合青草亚洲AV| 中文字幕亚洲欧美日韩在线不卡| 91精品xxx在线观看| 鲁丝一区二区三区免费| 欧美亚洲一级| 久久久久久久久久久久久久久| 大荫蒂欧美视频另类xxxx| 国产又爽又黄网站亚洲视频123| 久久久视频在线| 久久97久久97精品免视看秋霞| 日韩视频在线视频| av不卡免费电影| 中文字幕激情小说| 一区二区三区动漫| 成人国产网站| 中文字幕一区二区三区四区五区 | 亚洲视频福利| 国产精品成人无码专区| 日韩欧美亚洲成人| 国产精品免费观看| 国产一区香蕉久久| 亚洲激情久久| yjizz视频| 大伊人狠狠躁夜夜躁av一区| 黄色av网站在线看| 国产精品免费一区豆花| 91久久久精品国产| 国产xxx在线观看 | 在线免费看91| 久热精品视频在线免费观看| 亚洲综合网狠久久| 国模吧无码一区二区三区| 久久精品亚洲国产奇米99| 在线免费看毛片| 欧美老女人在线视频| 女仆av观看一区| 91激情视频在线| 亚洲精品亚洲人成人网| 日韩在线视频观看免费| 国产成人黄色av| 中文视频一区| 丰满少妇一区二区三区| 欧美性一二三区| 青青草原国产在线| 你懂的网址一区二区三区| 韩国av一区二区三区在线观看| 国产一级特黄视频| 一区二区av在线| 精品视频在线播放一区二区三区| 欧美在线观看黄| 国产欧美日本一区二区三区| 99视频在线观看免费| 欧美在线www| 亚洲影视一区| 全黄一级裸体片| 欧美一区二区视频在线观看 | 国产一区二区色| 亚洲精品护士| 黄色录像免费观看| 日韩精品视频免费| 国产精久久一区二区| 国产日产欧美视频| 一区二区三区鲁丝不卡| 都市激情一区| 国产一区在线免费|