關(guān)于workerman框架的內(nèi)部流程
首先應(yīng)該明白進(jìn)程的含義。
在這里我們要就是它的并發(fā)執(zhí)行的特點(diǎn)。
Workerman也實(shí)現(xiàn)了多個(gè)進(jìn)程同時(shí)為一個(gè)服務(wù)端口提供并發(fā)處理。
WorkerMan工作原理:
一.從系統(tǒng)以命令行的方式啟動(dòng)服務(wù)
服務(wù)啟動(dòng)是由系統(tǒng)通過(guò)命令行的方式執(zhí)行一段php代碼即:bin/wokermand
1.檢測(cè)當(dāng)前的運(yùn)行環(huán)境。
2.設(shè)置框架的工作目錄:WORKERMAN_ROOT_DIR。
3.載入主進(jìn)程文件Core/Master類(lèi),主進(jìn)程管理所有子進(jìn)程,負(fù)責(zé)自身的運(yùn)行狀態(tài)控制和其所有子進(jìn)程的管理工作。
4.生成單一模式配置對(duì)象,對(duì)象捆綁的是conf/workerman.conf配置文件及conf.d目錄下的所有配置項(xiàng)目,而且conf.d優(yōu)先級(jí)最高,所有配置項(xiàng)都有默認(rèn)值。
5.啟動(dòng)框架時(shí),php通過(guò)接口對(duì)系統(tǒng)的進(jìn)程和進(jìn)程id(PID)文件進(jìn)行管理和記錄,盡量保證當(dāng)前只有一個(gè)進(jìn)程在運(yùn)行。
6.檢測(cè)啟動(dòng)服務(wù)者身份,必須是以root啟動(dòng)。這樣做的好處是,保證當(dāng)前主進(jìn)程為最高權(quán)限。
7.處理具體的命令行指定cmd。
8.最終的結(jié)果是:Man\Core\Master::run($worker_user);其中$worker_user為命令的第二個(gè)參數(shù)。即指定運(yùn)行子進(jìn)程的用戶(hù)權(quán)限。
二.對(duì)外服務(wù)的執(zhí)行流程
即Man\Core\Master::run();的執(zhí)行過(guò)程。
1.初始化設(shè)置主進(jìn)程名,獲取內(nèi)存資源id,消息隊(duì)列id,并設(shè)置消息隊(duì)列
2.檢測(cè)程序運(yùn)行環(huán)境
3.創(chuàng)建兩個(gè)進(jìn)程(變成守護(hù)進(jìn)程)不理解。daemonize()
4.保存主進(jìn)程pid到WORKERMAN_PID_FILE文件
5.創(chuàng)建三個(gè)信號(hào):停止服務(wù),掛起重啟信號(hào),退出信號(hào)installSignal()
6.依據(jù)每個(gè)conf.d下面的配置文件對(duì)應(yīng)創(chuàng)建一個(gè)服務(wù)端口createListeningSockets()
7.依據(jù)配置conf.d文件創(chuàng)建指定數(shù)目的子進(jìn)程createOneWorker(),并將同一類(lèi)的子進(jìn)程與對(duì)應(yīng)配置文件的監(jiān)聽(tīng)服務(wù)綁定。最后啟動(dòng)進(jìn)程:$worker->start();
spawnWorkers();
三.$worker的啟動(dòng)過(guò)程
以上完成了主進(jìn)程的創(chuàng)建、所有子進(jìn)程的創(chuàng)建、服務(wù)的啟動(dòng)綁定,下面就是worker對(duì)象最終將提供的服務(wù)。
1.實(shí)例化過(guò)程和start()過(guò)程
(1).完成一些基本的參數(shù)初始化工作,如workerName、isPersistentConnection、maxRequests等
(2).使用事件輪詢(xún)庫(kù)將事件event綁定。一個(gè)worker一個(gè)進(jìn)程,每個(gè)worker綁定一個(gè)事件輪詢(xún)庫(kù),名字都是Libevent,因?yàn)槭遣煌M(jìn)程,所以互不相干。引入事件輪詢(xún)庫(kù)
Man/Core/Events/Libevent.php
(3).初始化與這個(gè)進(jìn)程綁定的事件輪詢(xún)庫(kù)Libevent.php,輪詢(xún)實(shí)現(xiàn)了添加、刪除、循環(huán)三個(gè)操作。
(4).輪詢(xún)庫(kù)的初始化:申請(qǐng)內(nèi)存,初始化定時(shí)器堆和事件隊(duì)列,為event_base對(duì)象選擇底層事件函數(shù)封裝對(duì)象,初始化活動(dòng)隊(duì)列。
(5).啟動(dòng)事件機(jī)制。一共就三種事件:讀事件,寫(xiě)事件,信號(hào)事件
(6).進(jìn)入主體循環(huán),等待觸發(fā)。
四.Event機(jī)制
.......
五.特殊的G/W模型
Gateway專(zhuān)門(mén)處理網(wǎng)關(guān),Worker專(zhuān)門(mén)處理業(yè)務(wù)邏輯。
Gateway管理所有的外部網(wǎng)絡(luò)數(shù)據(jù)進(jìn)出,外部數(shù)據(jù)可以是各種協(xié)議進(jìn)入
它收到數(shù)據(jù)分進(jìn)行數(shù)據(jù)處理,將其打包成二進(jìn)制,并啟動(dòng)多進(jìn)程
開(kāi)通內(nèi)部即本地端口
最后讓其進(jìn)程和端口綁定處于監(jiān)聽(tīng)狀態(tài)。
上述:Gateway一方面處于監(jiān)聽(tīng)狀態(tài)接收網(wǎng)關(guān)數(shù)據(jù),
另一方面為自己開(kāi)通本地(通常是本地)監(jiān)聽(tīng)服務(wù),提供給worker使用。
對(duì)外是多個(gè)進(jìn)程綁定同一個(gè)對(duì)外服務(wù),對(duì)內(nèi)一個(gè)進(jìn)程對(duì)應(yīng)一個(gè)不同的本地監(jiān)聽(tīng)服務(wù)。
注意:gateway與worker之間是二進(jìn)制數(shù)據(jù)傳輸。