導語php
PHP是最好的語言,Swoole從新定義了最好的語言,這固然是個梗了,不過php作爲一個入門低、開發快、執行效率高的一門語言,而在以快速著稱的pc互聯網時代,無可爭議的成爲首選,這是php的優點,而後優點慢慢轉化爲思惟定勢,在不少工程師看來php開發就等同於web開發,然而現在已是移動互聯的時代,物聯網,智能硬件也如火如塗,好像php不是那麼受待見了(ps:一直如此),而swoole的出現,成功突破了這一思惟定勢,使phper能夠從web開發跳出,進入了更大的服務器網絡編程領域,但web開發和服務器網絡編程在開發思惟上仍是有很大的不一樣,本系列文章將經過swoole的介紹,幫助你們作思惟轉換,從而進入一個新天地。mysql
PHP與SWOOLE的關係web
swoole是php的一個擴展,純c開發,主要是爲了補充php在網絡編程方面的不足sql
PHP與SWOOLE的運行模式編程
php作爲swoole的宿主,因此瞭解php自己的運行模式是必不可少的,下圖是以cli下執行一個php文件時的完整流程
這上層有個SAPI的概念,SAPI是php給外部環境可以執行php內核提供的一個統一接口,咱們常見的三種SAPI有cli, php-fpm, mod_php。緩存
在這裏,以fpm爲例,把運行週期的關鍵5步拿出來:安全
MINIT服務器
在這步(包括以前)php引擎會初始化一些公用配置,讀取ini文件,加載zend引擎,執行因此模塊的MINIT模塊,而後就長駐在fpm進程中,而後就等待處理請求swoole
RINIT網絡
在每一個請求過來以後,會調用全部模塊的RINIT進行一些請求內數據的初始化,好比一些超全局變量,一些模塊數據初始化等
執行php
而後在這加載php文件,進行詞法,語法分析,生成opcode代碼,交由zend vm執行, 暫存執行結果
RSHUTDOWN
在把結果返回給fpm以前,會調用全部模塊的RSHUTDOWN模塊進行一些數據的回收,zend vm也會關閉打開的數據流,進行內存釋放等操做,而後把暫存的執行結果flush輸出
MSHUTDOWN
這一階段在重啓fpm時發生,會調用全部模塊的MSHUTDOWN,關閉zend引擎等操做
到這,能夠獲得一些結論:
fpm每一個請求都是在執行2~4步
opcode cache是把第3步的詞法分析、語法分析、生成opcode代碼這幾個操做給緩存起來了,從而達到加速的做用
幾個誤區:
請求都是獨立的,不能進行數據共享? 其實仍是有辦法進行在數據共享的,那就是在MINIT這步,由於這一步的數據是長駐在fpm進程中,比較典型的是ini配置文件,我沒看過鳥哥新出的yaconf, 不過我猜想yaconf的配置讀取也應該是放在這一步進行
每一個請求都能獨立釋放內存, 因此整體是安全的。(這也是大多數phper沒有關閉資源的習慣,如mysql close等),那這也是有問題的,頗有可能在擴展層有內存泄漏的存在,因此fpm提供max_reuqest來重啓fpm,達到徹底釋放內存的目的,固然整體而言,php在內存控制方面仍是至關不錯的。
OK, 咱們分析出了php的基本流程,那swoole是在哪一步執行的呢?首先,swoole運行有個前提條件:必需在cli模式下執行. 而後在第3步,swoole就接管了php,進入了swoole的生命週期了。swooele的生命週期以多進程模式爲例,以下:
onStart
在回調此函數以前Swoole Server已進行了以下操做
已建立了manager進程
已建立了worker子進程
已監聽全部TCP/UDP端口
已監聽了定時器
此函數是在主進程回調的,和worker進程的onWorkStart是並行的沒有前後之分,在此回調裏強烈要求只作log記錄,設置進程名操做,不作業務邏輯,不然業務邏輯代碼的錯誤致使master進程crash,讓整個swoole server不對對外提供服務了。
onWorkStart
每一個worker或task進程在啓動以後,會回調此函數,因爲此回調相似於fpm裏的MINIT,因此能夠在這裏作一個全局的資源加載,框架初始化之類的操做,這樣能夠對每一個請求作全局共享,而達到提高性能的目的
onReceive
每一個請求(也稱數據到達),會回調此函數,而後進行業務邏輯處理,輸出結果
onWorkerStop
worker退出時,會回調此函數。
onShutDown
swoole服務中止回調此函數,而後繼續fpm的第四、5步,進而退出ph生命週期。