php是最好的語言,swoole重新定義了最好的語言,這當然是個梗了,不過php做為一個入門低、開發快、執行效率高的一門語言,而在以快速著稱的pc網際網路時代,無可争議的成為首選,這是php的優勢,然後優勢慢慢轉化為思維定勢,在很多工程師看來php開發就等同于web開發,然而如今已經是移動互聯的時代,物聯網,智能硬體也如火如塗,好像php不是那麼受待見了(ps:一直如此),而swoole的出現,成功突破了這一思維定勢,使phper可以從web開發跳出,進入了更大的伺服器網絡程式設計領域,但web開發和伺服器網絡程式設計在開發思維上還是有很大的不同,本系列文章将通過swoole的介紹,幫助大家做思維轉換,進而進入一個新天地。
php與swoole的關系
swoole是php的一個擴充,純c開發,主要是為了補充php在網絡程式設計方面的不足
php與swoole的運作模式
php做為swoole的宿主,是以了解php本身的運作模式是必不可少的,下圖是以cli下執行一個php檔案時的完整流程
這上層有個sapi的概念,sapi是php給外部環境能夠執行php核心提供的一個統一接口,我們常見的三種sapi有cli, php-fpm, mod_php。
在這裡,以fpm為例,把運作周期的關鍵5步拿出來:
1minit
在這步(包括之前)php引擎會初始化一些公用配置,讀取ini檔案,加載zend引擎,執行是以子產品的minit子產品,然後就長駐在fpm程序中,然後就等待處理請求
2rinit
在每個請求過來之後,會調用所有子產品的rinit進行一些請求内資料的初始化,比如一些超全局變量,一些子產品資料初始化等
3執行php
然後在這加載php檔案,進行詞法,文法分析,生成opcode代碼,交由zend vm執行, 暫存執行結果
4rshutdown
在把結果傳回給fpm之前,會調用所有子產品的rshutdown子產品進行一些資料的回收,zend vm也會關閉打開的資料流,進行記憶體釋放等操作,然後把暫存的執行結果flush輸出
5mshutdown
這一階段在重新開機fpm時發生,會調用所有子產品的mshutdown,關閉zend引擎等操作
到這,可以得到一些結論:
fpm每個請求都是在執行2~4步
opcode cache是把第3步的詞法分析、文法分析、生成opcode代碼這幾個操作給緩存起來了,進而達到加速的作用
幾個誤區:
1請求都是獨立的,不能進行資料共享? 其實還是有辦法進行在資料共享的,那就是在minit這步,因為這一步的資料是長駐在fpm程序中,比較典型的是ini配置檔案,我沒看過鳥哥新出的yaconf, 不過我猜測yaconf的配置讀取也應該是放在這一步進行
ok, 我們分析出了php的基本流程,那swoole是在哪一步執行的呢?首先,swoole運作有個前提條件:必需在cli模式下執行. 然後在第3步,swoole就接管了php,進入了swoole的生命周期了。swooele的生命周期以多程序模式為例,如下:
1onstart
在回調此函數之前swoole server已進行了如下操作
已建立了manager程序,已建立了worker子程序,已監聽所有tcp/udp端口,已監聽了定時器
此函數是在主程序回調的,和worker程序的onworkstart是并行的沒有先後之分,在此回調裡強烈要求隻做log記錄,設定程序名操作,不做業務邏輯,否則業務邏輯代碼的錯誤導緻master程序crash,讓整個swoole server不對對外提供服務了。
2onworkstart
每個worker或task程序在啟動之後,會回調此函數,由于此回調類似于fpm裡的minit,是以可以在這裡做一個全局的資源加載,架構初始化之類的操作,這樣可以對每個請求做全局共享,而達到提升性能的目的
3onreceive
每個請求(也稱資料到達),會回調此函數,然後進行業務邏輯處理,輸出結果
4onworkerstop
worker退出時,會回調此函數。
5onshutdown
swoole服務停止回調此函數,然後繼續fpm的第4、5步,進而退出php生命周期。