關於使用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的索引