­

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