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