php是單線程。php是靠多進程來處理任務,任何后端語言都可以采用多進程處理方式。如我們常用的php-fpm進程管理器。線程與協程,大小的關系是進程>線程>協程,而我們所說的swoole讓php實現了多線程,其實在這里來說,就是好比讓php創建了多個進程,每個進程執行一條線程,從而實現了php"多線程"(java是在一個進程內創建多個線程).
swoole中我啟動了一個serve像一個工廠,有兩個主要進程,master和manager進程。master進程像創始人老板負責單子業務洽談,有錢有資源,他拉來一批職業經理人manager進程幫自己管理廠子,然后manager就fork出來很多工人worker進程來干活,后來發現供應物料后勤什么的比較費時間就交給了taskworker進程來做。這樣的話一個serve工廠就建立起來了。
woole執行流程
當客戶端請求進入Master主進程后會被Master主線程接收到
將讀寫操作的監聽注冊到對應的Reactor線程中,并通知Worker工作進程處理onConnect,也就是接收到連接的回調。
客戶端的數據會通知對應的Reactor線程并發送給Worker工作進程進行處理。
如果Worker工作進程投遞任務,將數據通過管道發送給Task任務進程,Task任務進程處理完后會發送給Worker工作進程。
Worker工作進程會通知Reactor線程發送數據給客戶端。
當Worker工作進程出現異常時關閉,Manager管理進程會重新創建一個Worker工作進程,保證Worker工作進程的數量是固定的。
Swoole Coroutine和 Go Goroutine的區別
swoole的協程需要再協程上下文中使用
swoole的協程是通過hook底層php函數實現的,go是原生支持的
swoole是單線程協程,同一時間只會調度一個協程,而go是多線程實現的
Swoole-HTTP-Server模型
Swoole-HTTP-Server和LNMP-with-Swoole相比有巨大的變化,這種模型中充當WebServer角色的構件不僅僅有nginx,應用本身也包含了一個內建WebServer,不過由于Swoole Http Server不是專業的Http Server,對Http的處理不完善 ,因此仍然需要使用Nginx作為靜態資源服務器以及反代,Swoole Http Server僅僅處理PHP相關的Http流量。
一方面由于Swoole已經包含了WebServer,不再需要實現cgi或者fast-cgi的通用協議去和WebServer通信,另一方面Swoole有自己的進程管理,因此PHP-fpm可以直接被去除了。對于PHP資源而言,在這種模型中,Swoole Http Server的地位相當于傳統模型中的nginx和PHP-fpm之和。