Swoole 的運行模式


Swoole 做了什么


Swoole 是 php 的一個擴展,但是他又不是普通的擴展,其最明顯的特點就是:一但運行后就會接管PHP的控制權,進入事件循環。 當某種IO事件發生時, Swoole 會回調開發者設置的指定PHP函數。

也就是說 SwooleServer 更像是一個用 C 語言封裝好的一個 Tcp/Udp 支持 多線程, EventLoop事件驅動異步 等功能的框架。開發者不需要關心底層的各種實現,直接的在業務層面進行開發即可。

什么是IO事件


很多 php 程序員沒有使用過其他語言開發Server,也不太了解除了php-fpm以外運行模式的php程序,初次使用Swoole時總是會有各種摸不到頭腦的事情。其實IO我們經常提起如: 磁盤IO ,網絡IO 在這里Swoole所指的IO事件實際上是指 網絡IO 事件。

在日常生活中你留下了一個郵箱,當有人給你發送郵件的時候,你就會收到郵件提醒;而對於你而言,你並不關心郵件是如何送達的,你只關心你有沒有收到郵件,當你收到郵件之后會根據郵件的內容和發送人去做各種各樣的處理。在這個比喻中,Swoole就承擔了底層網絡事件的監聽及各種底層事件處理,當收到郵件(請求)時,會觸發收件(接收)提醒,然后將控制權轉交給你(預先注冊的事件回調函數),來進行后續的處理。

Swoole 的運行流程


初始化
<?php // new 一個SwoolerServer對象 並指定監聽端口 和運行模式 以及Socket類型 // 此時的一切一切 都是開發者進行配置的時間,沒有任何其他事情發生 $server = new Swoole\Server('0.0.0.0', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP); // 設置運行參數, 就像你平時做的那樣,給$server 對象配置相關的參數 $server->set([ 'worker_num' => 4, // 工作進程數量 'daemonize' => true, // 是否以守護進程模式運行 'backlog' => 128, // Listen隊列長度 ]); // 注冊事件回調函數 // 這里指 當底層Tcp新連接進入事件時 交給Tcp 類的 onConnect 靜態方法處理 $server->on('Connect', [Tcp::class, 'onConnect']); // 這里指 當收到數據時 交給Tcp 類的 onReceive 靜態方法處理 $server->on('Receive', [Tcp::class, 'onReceive']); // 這里指 當Tcp客戶端連接關閉時 交給Tcp 類的 onClose 靜態方法處理 $server->on('Close', [Tcp::class, 'onClose']); 

在上面的示例當中,實際上Swoole還尚未啟動,但是我們已經預先配置了許多必要的配置條件。鑒於有的新人還尚不了解什么叫做 回調函數,在這里我簡單的講解一下:

所謂的回調函數(CallBack) 就好比是張開了夾子的捕鼠器,我們設定當有老鼠踩到捕鼠器的時候,他會關閉夾子然后捉住老鼠,我們放置捕鼠器的時候,捕鼠器並沒有真的抓老鼠。這個設定就是回調,他不立刻執行,會在遇到觸發條件(事件)時執行,在上面的示例當中我們放置了3個捕鼠器(回調函數),我們只需要知道他會在特定老鼠(事件)踩到的時候(發生的時候)去執行我們期望的功能就好。

Server Start
// 啟動Swole Server 將由 Swoole 接管php運行 $server->start(); 

至此Swoole 完全的接管了php的運行,並且監聽相應端口並當發生事件時去執行開發者自定義的事件回調。

僅僅如此嗎?

事實上Swoole 在啟動的時候做了非常多的事情:

Swoole 運行流程圖: Swoole運行流程圖

Swoole 進程關系圖: Swoole進程關系圖

上圖中我們可以了解,Swoole 會創建一個 Manager 進程專門 管理 Work 和 Task 進程。 而 Work 進程則直接通過 Unix Socket 和 Master 進程通訊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM