Swoole 的運行模式
注: 以下內(nèi)容主要指 SwooleServer
。
Swoole 做了什么
Swoole
是 php 的一個擴展,但是他又不是普通的擴展,其最明顯的特點就是:一但運行后就會接管PHP的控制權(quán),進(jìn)入事件循環(huán)。 當(dāng)某種IO事件發(fā)生時, Swoole
會回調(diào)開發(fā)者設(shè)置的指定PHP函數(shù)。
也就是說 SwooleServer
更像是一個用 C
語言封裝好的一個 Tcp/Udp
支持 多線程
, EventLoop
,事件驅(qū)動
,異步
等功能的框架。開發(fā)者不需要關(guān)心底層的各種實現(xiàn),直接的在業(yè)務(wù)層面進(jìn)行開發(fā)即可。
什么是IO事件
很多 php 程序員沒有使用過其他語言開發(fā)Server,也不太了解除了php-fpm以外運行模式的php程序,初次使用Swoole時總是會有各種摸不到頭腦的事情。其實IO我們經(jīng)常提起如: 磁盤IO
,網(wǎng)絡(luò)IO
在這里Swoole所指的IO事件實際上是指 網(wǎng)絡(luò)IO
事件。
在日常生活中你留下了一個郵箱,當(dāng)有人給你發(fā)送郵件的時候,你就會收到郵件提醒;而對于你而言,你并不關(guān)心郵件是如何送達(dá)的,你只關(guān)心你有沒有收到郵件,當(dāng)你收到郵件之后會根據(jù)郵件的內(nèi)容和發(fā)送人去做各種各樣的處理。在這個比喻中,Swoole就承擔(dān)了底層網(wǎng)絡(luò)事件的監(jiān)聽及各種底層事件處理,當(dāng)收到郵件(請求)時,會觸發(fā)收件(接收)提醒,然后將控制權(quán)轉(zhuǎn)交給你(預(yù)先注冊的事件回調(diào)函數(shù)),來進(jìn)行后續(xù)的處理。
Swoole 的運行流程
初始化
<?php
// new 一個SwoolerServer對象 并指定監(jiān)聽端口 和運行模式 以及Socket類型
// 此時的一切一切 都是開發(fā)者進(jìn)行配置的時間,沒有任何其他事情發(fā)生
$server = new Swoole\Server('0.0.0.0', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);
// 設(shè)置運行參數(shù), 就像你平時做的那樣,給$server 對象配置相關(guān)的參數(shù)
$server->set([
'worker_num' => 4, // 工作進(jìn)程數(shù)量
'daemonize' => true, // 是否以守護(hù)進(jìn)程模式運行
'backlog' => 128, // Listen隊列長度
]);
// 注冊事件回調(diào)函數(shù)
// 這里指 當(dāng)?shù)讓覶cp新連接進(jìn)入事件時 交給Tcp 類的 onConnect 靜態(tài)方法處理
$server->on('Connect', [Tcp::class, 'onConnect']);
// 這里指 當(dāng)收到數(shù)據(jù)時 交給Tcp 類的 onReceive 靜態(tài)方法處理
$server->on('Receive', [Tcp::class, 'onReceive']);
// 這里指 當(dāng)Tcp客戶端連接關(guān)閉時 交給Tcp 類的 onClose 靜態(tài)方法處理
$server->on('Close', [Tcp::class, 'onClose']);
在上面的示例當(dāng)中,實際上Swoole還尚未啟動,但是我們已經(jīng)預(yù)先配置了許多必要的配置條件。鑒于有的新人還尚不了解什么叫做 回調(diào)函數(shù)
,在這里我簡單的講解一下:
所謂的
回調(diào)函數(shù)(CallBack)
就好比是張開了夾子的捕鼠器,我們設(shè)定當(dāng)有老鼠踩到捕鼠器的時候,他會關(guān)閉夾子然后捉住老鼠,我們放置捕鼠器的時候,捕鼠器并沒有真的抓老鼠。這個設(shè)定就是回調(diào),他不立刻執(zhí)行,會在遇到觸發(fā)條件(事件)時執(zhí)行,在上面的示例當(dāng)中我們放置了3個捕鼠器(回調(diào)函數(shù)),我們只需要知道他會在特定老鼠(事件)踩到的時候(發(fā)生的時候)去執(zhí)行我們期望的功能就好。
Server Start
// 啟動Swole Server 將由 Swoole 接管php運行
$server->start();
至此Swoole 完全的接管了php的運行,并且監(jiān)聽相應(yīng)端口并當(dāng)發(fā)生事件時去執(zhí)行開發(fā)者自定義的事件回調(diào)。
僅僅如此嗎?
事實上Swoole 在啟動的時候做了非常多的事情:
Swoole 運行流程圖:
![]()
Swoole 進(jìn)程關(guān)系圖:
上圖中我們可以了解,Swoole 會創(chuàng)建一個 Manager
進(jìn)程專門 管理 Work
和 Task
進(jìn)程。 而 Work
進(jìn)程則直接通過 Unix Socket
和 Master
進(jìn)程通訊。