swoole項目思惟轉換 -- 前篇

導語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步拿出來:安全

  1. MINIT服務器

    在這步(包括以前)php引擎會初始化一些公用配置,讀取ini文件,加載zend引擎,執行因此模塊的MINIT模塊,而後就長駐在fpm進程中,而後就等待處理請求swoole

  2. RINIT網絡

    在每一個請求過來以後,會調用全部模塊的RINIT進行一些請求內數據的初始化,好比一些超全局變量,一些模塊數據初始化等

  3. 執行php

    而後在這加載php文件,進行詞法,語法分析,生成opcode代碼,交由zend vm執行, 暫存執行結果

  4. RSHUTDOWN

    在把結果返回給fpm以前,會調用全部模塊的RSHUTDOWN模塊進行一些數據的回收,zend vm也會關閉打開的數據流,進行內存釋放等操做,而後把暫存的執行結果flush輸出

  5. MSHUTDOWN

    這一階段在重啓fpm時發生,會調用全部模塊的MSHUTDOWN,關閉zend引擎等操做

     

     

到這,能夠獲得一些結論:

  1. fpm每一個請求都是在執行2~4步

  2. opcode cache是把第3步的詞法分析、語法分析、生成opcode代碼這幾個操做給緩存起來了,從而達到加速的做用

幾個誤區:

  1. 請求都是獨立的,不能進行數據共享? 其實仍是有辦法進行在數據共享的,那就是在MINIT這步,由於這一步的數據是長駐在fpm進程中,比較典型的是ini配置文件,我沒看過鳥哥新出的yaconf, 不過我猜想yaconf的配置讀取也應該是放在這一步進行

  2. 每一個請求都能獨立釋放內存, 因此整體是安全的。(這也是大多數phper沒有關閉資源的習慣,如mysql close等),那這也是有問題的,頗有可能在擴展層有內存泄漏的存在,因此fpm提供max_reuqest來重啓fpm,達到徹底釋放內存的目的,固然整體而言,php在內存控制方面仍是至關不錯的。

OK, 咱們分析出了php的基本流程,那swoole是在哪一步執行的呢?首先,swoole運行有個前提條件:必需在cli模式下執行. 而後在第3步,swoole就接管了php,進入了swoole的生命週期了。swooele的生命週期以多進程模式爲例,以下:

  1. onStart

    在回調此函數以前Swoole Server已進行了以下操做

    • 已建立了manager進程

    • 已建立了worker子進程

    • 已監聽全部TCP/UDP端口

    • 已監聽了定時器

    此函數是在主進程回調的,和worker進程的onWorkStart是並行的沒有前後之分,在此回調裏強烈要求只作log記錄,設置進程名操做,不作業務邏輯,不然業務邏輯代碼的錯誤致使master進程crash,讓整個swoole server不對對外提供服務了。

  2. onWorkStart

    每一個worker或task進程在啓動以後,會回調此函數,因爲此回調相似於fpm裏的MINIT,因此能夠在這裏作一個全局的資源加載,框架初始化之類的操做,這樣能夠對每一個請求作全局共享,而達到提高性能的目的

  3. onReceive

    每一個請求(也稱數據到達),會回調此函數,而後進行業務邏輯處理,輸出結果

  4. onWorkerStop

    worker退出時,會回調此函數。

  5. onShutDown

    swoole服務中止回調此函數,而後繼續fpm的第四、5步,進而退出ph生命週期。        

相關文章
相關標籤/搜索