PHP 超高性能可擴展HTTP服務(wù)框架Webman
webman是什么?
webman是一款基于workerman開發(fā)的高性能HTTP服務(wù)框架。webman用于替代傳統(tǒng)的php-fpm架構(gòu),提供超高性能可擴展的HTTP服務(wù)。你可以用webman開發(fā)網(wǎng)站,也可以開發(fā)HTTP接口或者微服務(wù)。
除此之外,webman還支持自定義進程,可以做workerman能做的任何事情,例如websocket服務(wù)、物聯(lián)網(wǎng)、游戲、TCP服務(wù)、UDP服務(wù)、unix socket服務(wù)等等。
webman理念
以最小內(nèi)核提供最大的擴展性與最強的性能。
webman僅提供最核心的功能(路由、中間件、session、自定義進程接口)。其余功能全部復(fù)用composer生態(tài),這意味著你可以在webman里使用最熟悉的功能組件,例如在數(shù)據(jù)庫方面開發(fā)者可以選擇使用Laravel的illuminate/database,也可以是ThinkPHP的ThinkORM,還可以是其它組件如Medoo。在webman里集成他們是非常容易的事情。
webman特點
1、高穩(wěn)定性。webman基于workerman開發(fā),workerman一直是業(yè)界bug極少的高穩(wěn)定性socket框架。
2、超高性能。webman性能高于傳統(tǒng)php-fpm框架10-100倍左右,比go的gin echo等框架性能高一倍左右。
3、高復(fù)用。無需修改,可以復(fù)用絕大部分composer組件及類庫。
4、高擴展性。支持自定義進程,可以做workerman能做的任何事情。
5、超級簡單易用,學(xué)習(xí)成本極低,代碼書寫與傳統(tǒng)框架沒有區(qū)別。
6、使用最為寬松友好的MIT開源協(xié)議。
webman性能
傳統(tǒng)框架請求處理流程
nginx/apache接收請求
nginx/apache將請求傳遞給php-fpm
php-fpm初始化環(huán)境,如創(chuàng)建變量列表
php-fpm調(diào)用各個擴展/模塊的RINIT
php-fpm磁盤讀取php文件(使用opcache可避免)
php-fpm詞法分析、語法分析、編譯成opcode(使用opcache可避免)
php-fpm執(zhí)行opcode 包括
8.9.10.11
框架初始化,如實例化各種類,包括如容器、控制器、路由、中間件等。
框架連接數(shù)據(jù)庫并權(quán)限驗證,連接redis
框架執(zhí)行業(yè)務(wù)邏輯
框架關(guān)閉數(shù)據(jù)庫、redis連接
php-fpm釋放資源、銷毀所有類定義、實例、銷毀符號表等
php-fpm順序調(diào)用各個擴展/模塊的RSHUTDOWN方法
php-fpm將結(jié)果轉(zhuǎn)發(fā)給nginx/apache
nginx/apache將結(jié)果返回給客戶端
webman的請求處理流程
框架接收請求
框架執(zhí)行業(yè)務(wù)邏輯
框架將結(jié)果返回給客戶端
注意:沒錯,在沒有nginx反代的情況下,框架只有這3步??梢哉f這已經(jīng)是php框架的極致,這使得webman性能是傳統(tǒng)框架的幾倍甚至數(shù)十倍。
傳統(tǒng)的 FPM/Apache 的 PHP 應(yīng)用性能無法與 Java、Golang 等應(yīng)用抗衡, 主要有兩點原因:
短生命周期,每次請求都會重復(fù)的初始化/銷毀很多內(nèi)存結(jié)構(gòu)。
傳統(tǒng)的 PHP 應(yīng)用都是阻塞IO的,在高并發(fā)下大量的CPU浪費在進程上下文切換。
與go語言的web框架性能比對
帶數(shù)據(jù)庫查詢業(yè)務(wù),webman比同類型go語言的web框架性能高一倍左右。以上數(shù)據(jù)來自techempower.com
壓力測試
壓測結(jié)果受到哪些因素影響?
壓力機到服務(wù)器的網(wǎng)絡(luò)延遲 (建議內(nèi)網(wǎng)或本機壓測)
壓力機到服務(wù)器的帶寬 (建議內(nèi)網(wǎng)或本機壓測)
是否開啟HTTP keep-alive (建議開啟)
并發(fā)數(shù)是否足夠 (外網(wǎng)壓測要盡量開啟更大的并發(fā))
服務(wù)端進程數(shù)是否合理 (helloworld業(yè)務(wù)進程數(shù)建議與cpu數(shù)相同,數(shù)據(jù)庫業(yè)務(wù)進程數(shù)建議為cpu的四倍及以上)
業(yè)務(wù)自身性能 (例如是否使用了外網(wǎng)數(shù)據(jù)庫)
HTTP keep-alive是什么?
HTTP Keep-Alive機制是一種用于在單個TCP連接上發(fā)送多個HTTP請求和響應(yīng)的技術(shù),它對于性能測試結(jié)果影響很大,關(guān)閉keep-alive后QPS可能成倍下降。
目前瀏覽器都是默認開啟keep-alive的,也就是瀏覽器訪問某一個http地址后會將連接暫時保留不關(guān)閉,下一次請求時復(fù)用這個連接,用來提高性能。 壓測時建議開啟keep-alive。
壓測時如何開啟HTTP keep-alive?
如果是用的ab程序壓測需要加-k參數(shù),例如 ab -n100000 -c200 -k http://127.0.0.1:8787/
。 apipost需要在返回頭中返回gzip頭才能開啟keep-alive(apipost的bug,參考下面)。 其它壓測程序一般會默認開啟。
為什么通過外網(wǎng)壓測QPS很低?
外網(wǎng)延遲很大導(dǎo)致QPS很低,是正?,F(xiàn)象。例如壓測baidu頁面QPS可能只有幾十。建議內(nèi)網(wǎng)或者本機壓測,排除網(wǎng)絡(luò)延遲影響。如果一定要在外網(wǎng)壓測,可以通過增加并發(fā)數(shù)來增加吞吐量(需保證帶寬充足)。
為什么經(jīng)過nginx代理后性能下降?
nginx運行需要消耗系統(tǒng)資源。同時,nginx和webman之間的通訊也需要消耗一定的資源。然而,系統(tǒng)的資源是有限的,webman無法獲取到所有的系統(tǒng)資源,因此,整個系統(tǒng)的性能可能會有所下降是正常現(xiàn)象。
為了盡可能減少nginx代理帶來的性能影響,可以考慮關(guān)閉nginx日志(access_log off;
),開啟nginx到webman之間的keep-alive,參考nginx代理。
另外https和http相比會損耗更多資源,因為https需要進行SSL/TLS握手,數(shù)據(jù)加密解密,包的尺寸變大占用更多帶寬,這些會導(dǎo)致性能下降。
壓測如果用的是短鏈接(不開啟HTTP keep-alive),每次請求都需要額外的SSL/TLS握手通訊,性能會大幅降低。建議壓測https開啟HTTP keep-alive。
如何知道系統(tǒng)已經(jīng)達到性能極限?
一般來說CPU達到100%時說明系統(tǒng)性能已經(jīng)達到極限。如果CPU還有空閑說明還沒達到極限,這時候可以適當(dāng)增加并發(fā)提高QPS。
如果增加并發(fā)無法提高QPS則可能是webman進程數(shù)不夠,請適當(dāng)增加webman進程。如果仍然無法提高考慮帶寬是否足夠。
壓測命令示例
ab
# 100000請求 200并發(fā) 開啟keep-alive ab -n100000 -c200 -k http://127.0.0.1:8787/ # 100000請求 200并發(fā) 未開啟keep-alive ab -n100000 -c200 http://127.0.0.1:8787/
wrk
# 200 并發(fā)壓測10秒 開啟keep-alive(默認) wrk -c 200 -d 10s http://example.com
到此這篇關(guān)于PHP 超高性能可擴展HTTP服務(wù)框架Webman的文章就介紹到這了,更多相關(guān)Webman框架內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
laravel-admin自動生成模塊,及相關(guān)基礎(chǔ)配置方法
今天小編就為大家分享一篇laravel-admin自動生成模塊,及相關(guān)基礎(chǔ)配置方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10THINKPHP5分頁數(shù)據(jù)對象處理過程解析
這篇文章主要介紹了THINKPHP5分頁數(shù)據(jù)對象處理過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10基于jQueryUI和Corethink實現(xiàn)百度的搜索提示功能
這篇文章主要介紹了基于jQueryUI和Corethink實現(xiàn)百度的搜索提示功能,這里是以corethink模塊的形式,只需要安裝上訪問index.php?s=/test/index 就可以了,需要的朋友可以參考下2016-11-11php編寫的簡單頁面跳轉(zhuǎn)功能實現(xiàn)代碼
這篇文章主要介紹了php編寫的簡單頁面跳轉(zhuǎn)功能實現(xiàn)代碼,有需要的朋友可以參考一下2013-11-11destoon整合ucenter后注冊頁面不跳轉(zhuǎn)的解決方法
這篇文章主要介紹了destoon整合ucenter后注冊頁面不跳轉(zhuǎn)的解決方法,需要的朋友可以參考下2014-06-06