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