關於使用php理論實現swoole擴展的功能
- 2019 年 12 月 19 日
- 筆記
最近swoole在php中越來越知名,很多人說swoole給與了php的新生,有swoole的php可以和node js,go等語言抗衡,那麼,我們從技術角度來說,swoole到底實現了什麼,如果沒有php,就實現不了協程,多進程等功能嗎? 到底是php語言有問題?還是各大phper有問題?
swoole
首先我們了解下swoole究竟是什麼東西:
PHP的協程高性能網路通訊引擎,使用C/C++語言編寫,提供了PHP語言的非同步多執行緒伺服器,非同步TCP/UDP網路客戶端,非同步MySQL,非同步Redis,資料庫連接池,AsyncTask,消息隊列,毫秒定時器,非同步文件讀寫,非同步DNS查詢。 Swoole內置了Http/WebSocket伺服器端/客戶端、Http2.0伺服器端/客戶端。
根據swoole介紹,已經文檔說明的功能,我將swoole大概實現的功能大致列出:
1:tcp伺服器,http伺服器,websocket伺服器,redis 伺服器
2:udp伺服器
3:協程管理,協程非同步IO監聽
4:記憶體操作管理
5:多進程管理,多進程通訊,進程訊號監聽
6:非同步任務管理
7:tcp,udp客戶端
8:http,http2,mysql,redis等協程客戶端
9:定時器
在後面,我們將一個個講解,如何使用php實現功能.
tcp伺服器/udp伺服器
tcp/udp伺服器其實php使用socket函數,即可創建一個tcp伺服器了,我之前也寫過類似文章:php實現socket網路編程
首先,我們從swoole實現tcp/udp的具體架構說起:
tcp伺服器模型
swoole官網圖

在php中,pcntl擴展可支援多進程,但是不支援多執行緒,我們如果需要實現的話,只能把執行緒改為進程,通過php進程通訊-消息隊列
進行進程通訊
I/O復用模型
swoole採用了4種I/O模型(epoll,kqueue,select,poll),根據作業系統的不同而選擇不同的模型
在php中,我們可通過安裝libevent擴展,socket_select函數等方法實現I/O復用
通過php的socket擴展+I/O復用可實現tcp伺服器,再通過消息隊列等進程通訊方法,實現多進程的tcp伺服器
tcp/udp伺服器是swoole的核心,http,websocket等伺服器都是基於tcp實現
難點:
1:多進程通訊
2:I/O復用
3:tcp粘包處理
4:超時斷線處理
http伺服器
在上面,我們已經通過php實現了tcp伺服器,http作為tcp的子協議,只要我們在tcp接收邏輯中,解析http頭,進行響應的處理,並發送規定的http響應頭即可
難點:
1:http協議非常多,只能做簡單的get,post等協議解析,其他交給nginx伺服器
2:解析post等數據
websocket伺服器
websocket伺服器繼承http以及tcp,同樣,只需要解析好握手時的協議頭即可
難點:
1:websocket握手機制需要了解
協程
在協程方面,我們可直接通過yield實現協程php yield關鍵字以及協程的實現
難點:
1:封裝一個完善的協程框架
2:需要增加一個非同步I/O的監聽管理,與協程管理通訊,使其能夠自動監聽I/O完成,然後恢復協程
記憶體管理
關於記憶體管理方面,本人並不是很熟悉,只知道shmop擴展可實現php的共享記憶體
多進程
使用pcntl擴展可實現多進程,進程訊號,通過pipe,消息隊列等方法可實現進程通訊
非同步任務管理
通過pcntl創建非同步task任務,然後worker進程通過進程通訊將任務傳遞給task即可
tcp,udp客戶端
通過socket擴展即可實現:http://www.php20.cn/article/162
協程客戶端
大家都知道,mysql,redis等在php中通訊都是基於tcp的,我們可通過tcp非阻塞客戶端+通訊協議實現非同步的客戶端
再通過協程的模組,實現yield並監聽I/O,I/O到了之後恢復協程狀態
定時器
通過pcntl_alarm 函數進行定時發起進程訊號,再然後實現回調即可實現定時器
技術總結
由上面可知道,php是可基本實現swoole的大部分功能的,具體總結如下:
1:多進程,進程通訊方面,進程訊號,pipe管道通訊,消息隊列,共享記憶體都可實現
2:網路編程,socket擴展+libeventI/O復用即可實現
3:協程,I/O自動切換協程,通過yield關鍵字,socket設置非阻塞,即可實現協程並在I/O耗時時切換協程
4:非同步任務可由1實現
總結
swoole通過php擴展實現,優勢是非常大的,例如自動切換協程,內置函數的hook等.
寫這篇文章只是想讓自己,和大家更加了解swoole到底實現了什麼,php到底是不是最好的語言(手動滑稽)
拋棄swoole,我們php本身內置的擴展已經可以讓我們做很多事情,但是除了workerman,又有哪些知名的php socket框架呢?在swoole之前,為什麼沒人提起過協程化編程呢?這是我們作為phper該反思的
本文為仙士可原創文章,轉載無需和我聯繫,但請註明來自仙士可部落格www.php20.cn
- 上一篇: 深入了解session的執行步驟
- 下一篇: mysql的索引