PHP 超高性能可擴(kuò)展HTTP服務(wù)框架Webman
webman是什么?
webman是一款基于workerman開(kāi)發(fā)的高性能HTTP服務(wù)框架。webman用于替代傳統(tǒng)的php-fpm架構(gòu),提供超高性能可擴(kuò)展的HTTP服務(wù)。你可以用webman開(kāi)發(fā)網(wǎng)站,也可以開(kāi)發(fā)HTTP接口或者微服務(wù)。
除此之外,webman還支持自定義進(jìn)程,可以做workerman能做的任何事情,例如websocket服務(wù)、物聯(lián)網(wǎng)、游戲、TCP服務(wù)、UDP服務(wù)、unix socket服務(wù)等等。
webman理念
以最小內(nèi)核提供最大的擴(kuò)展性與最強(qiáng)的性能。
webman僅提供最核心的功能(路由、中間件、session、自定義進(jìn)程接口)。其余功能全部復(fù)用composer生態(tài),這意味著你可以在webman里使用最熟悉的功能組件,例如在數(shù)據(jù)庫(kù)方面開(kāi)發(fā)者可以選擇使用Laravel的illuminate/database,也可以是ThinkPHP的ThinkORM,還可以是其它組件如Medoo。在webman里集成他們是非常容易的事情。
webman特點(diǎn)
1、高穩(wěn)定性。webman基于workerman開(kāi)發(fā),workerman一直是業(yè)界bug極少的高穩(wěn)定性socket框架。
2、超高性能。webman性能高于傳統(tǒng)php-fpm框架10-100倍左右,比go的gin echo等框架性能高一倍左右。
3、高復(fù)用。無(wú)需修改,可以復(fù)用絕大部分composer組件及類(lèi)庫(kù)。
4、高擴(kuò)展性。支持自定義進(jìn)程,可以做workerman能做的任何事情。
5、超級(jí)簡(jiǎn)單易用,學(xué)習(xí)成本極低,代碼書(shū)寫(xiě)與傳統(tǒng)框架沒(méi)有區(qū)別。
6、使用最為寬松友好的MIT開(kāi)源協(xié)議。
webman性能
傳統(tǒng)框架請(qǐng)求處理流程
nginx/apache接收請(qǐng)求
nginx/apache將請(qǐng)求傳遞給php-fpm
php-fpm初始化環(huán)境,如創(chuàng)建變量列表
php-fpm調(diào)用各個(gè)擴(kuò)展/模塊的RINIT
php-fpm磁盤(pán)讀取php文件(使用opcache可避免)
php-fpm詞法分析、語(yǔ)法分析、編譯成opcode(使用opcache可避免)
php-fpm執(zhí)行opcode 包括
8.9.10.11框架初始化,如實(shí)例化各種類(lèi),包括如容器、控制器、路由、中間件等。
框架連接數(shù)據(jù)庫(kù)并權(quán)限驗(yàn)證,連接redis
框架執(zhí)行業(yè)務(wù)邏輯
框架關(guān)閉數(shù)據(jù)庫(kù)、redis連接
php-fpm釋放資源、銷(xiāo)毀所有類(lèi)定義、實(shí)例、銷(xiāo)毀符號(hào)表等
php-fpm順序調(diào)用各個(gè)擴(kuò)展/模塊的RSHUTDOWN方法
php-fpm將結(jié)果轉(zhuǎn)發(fā)給nginx/apache
nginx/apache將結(jié)果返回給客戶(hù)端
webman的請(qǐng)求處理流程
框架接收請(qǐng)求
框架執(zhí)行業(yè)務(wù)邏輯
框架將結(jié)果返回給客戶(hù)端
注意:沒(méi)錯(cuò),在沒(méi)有nginx反代的情況下,框架只有這3步。可以說(shuō)這已經(jīng)是php框架的極致,這使得webman性能是傳統(tǒng)框架的幾倍甚至數(shù)十倍。
傳統(tǒng)的 FPM/Apache 的 PHP 應(yīng)用性能無(wú)法與 Java、Golang 等應(yīng)用抗衡, 主要有兩點(diǎn)原因:
短生命周期,每次請(qǐng)求都會(huì)重復(fù)的初始化/銷(xiāo)毀很多內(nèi)存結(jié)構(gòu)。
傳統(tǒng)的 PHP 應(yīng)用都是阻塞IO的,在高并發(fā)下大量的CPU浪費(fèi)在進(jìn)程上下文切換。
與go語(yǔ)言的web框架性能比對(duì)

帶數(shù)據(jù)庫(kù)查詢(xún)業(yè)務(wù),webman比同類(lèi)型go語(yǔ)言的web框架性能高一倍左右。以上數(shù)據(jù)來(lái)自techempower.com
壓力測(cè)試
壓測(cè)結(jié)果受到哪些因素影響?
壓力機(jī)到服務(wù)器的網(wǎng)絡(luò)延遲 (建議內(nèi)網(wǎng)或本機(jī)壓測(cè))
壓力機(jī)到服務(wù)器的帶寬 (建議內(nèi)網(wǎng)或本機(jī)壓測(cè))
是否開(kāi)啟HTTP keep-alive (建議開(kāi)啟)
并發(fā)數(shù)是否足夠 (外網(wǎng)壓測(cè)要盡量開(kāi)啟更大的并發(fā))
服務(wù)端進(jìn)程數(shù)是否合理 (helloworld業(yè)務(wù)進(jìn)程數(shù)建議與cpu數(shù)相同,數(shù)據(jù)庫(kù)業(yè)務(wù)進(jìn)程數(shù)建議為cpu的四倍及以上)
業(yè)務(wù)自身性能 (例如是否使用了外網(wǎng)數(shù)據(jù)庫(kù))
HTTP keep-alive是什么?
HTTP Keep-Alive機(jī)制是一種用于在單個(gè)TCP連接上發(fā)送多個(gè)HTTP請(qǐng)求和響應(yīng)的技術(shù),它對(duì)于性能測(cè)試結(jié)果影響很大,關(guān)閉keep-alive后QPS可能成倍下降。
目前瀏覽器都是默認(rèn)開(kāi)啟keep-alive的,也就是瀏覽器訪(fǎng)問(wèn)某一個(gè)http地址后會(huì)將連接暫時(shí)保留不關(guān)閉,下一次請(qǐng)求時(shí)復(fù)用這個(gè)連接,用來(lái)提高性能。 壓測(cè)時(shí)建議開(kāi)啟keep-alive。
壓測(cè)時(shí)如何開(kāi)啟HTTP keep-alive?
如果是用的ab程序壓測(cè)需要加-k參數(shù),例如 ab -n100000 -c200 -k http://127.0.0.1:8787/。 apipost需要在返回頭中返回gzip頭才能開(kāi)啟keep-alive(apipost的bug,參考下面)。 其它壓測(cè)程序一般會(huì)默認(rèn)開(kāi)啟。
為什么通過(guò)外網(wǎng)壓測(cè)QPS很低?
外網(wǎng)延遲很大導(dǎo)致QPS很低,是正?,F(xiàn)象。例如壓測(cè)baidu頁(yè)面QPS可能只有幾十。建議內(nèi)網(wǎng)或者本機(jī)壓測(cè),排除網(wǎng)絡(luò)延遲影響。如果一定要在外網(wǎng)壓測(cè),可以通過(guò)增加并發(fā)數(shù)來(lái)增加吞吐量(需保證帶寬充足)。
為什么經(jīng)過(guò)nginx代理后性能下降?
nginx運(yùn)行需要消耗系統(tǒng)資源。同時(shí),nginx和webman之間的通訊也需要消耗一定的資源。然而,系統(tǒng)的資源是有限的,webman無(wú)法獲取到所有的系統(tǒng)資源,因此,整個(gè)系統(tǒng)的性能可能會(huì)有所下降是正?,F(xiàn)象。
為了盡可能減少nginx代理帶來(lái)的性能影響,可以考慮關(guān)閉nginx日志(access_log off;),開(kāi)啟nginx到webman之間的keep-alive,參考nginx代理。
另外https和http相比會(huì)損耗更多資源,因?yàn)閔ttps需要進(jìn)行SSL/TLS握手,數(shù)據(jù)加密解密,包的尺寸變大占用更多帶寬,這些會(huì)導(dǎo)致性能下降。
壓測(cè)如果用的是短鏈接(不開(kāi)啟HTTP keep-alive),每次請(qǐng)求都需要額外的SSL/TLS握手通訊,性能會(huì)大幅降低。建議壓測(cè)https開(kāi)啟HTTP keep-alive。
如何知道系統(tǒng)已經(jīng)達(dá)到性能極限?
一般來(lái)說(shuō)CPU達(dá)到100%時(shí)說(shuō)明系統(tǒng)性能已經(jīng)達(dá)到極限。如果CPU還有空閑說(shuō)明還沒(méi)達(dá)到極限,這時(shí)候可以適當(dāng)增加并發(fā)提高QPS。
如果增加并發(fā)無(wú)法提高QPS則可能是webman進(jìn)程數(shù)不夠,請(qǐng)適當(dāng)增加webman進(jìn)程。如果仍然無(wú)法提高考慮帶寬是否足夠。
壓測(cè)命令示例
ab
# 100000請(qǐng)求 200并發(fā) 開(kāi)啟keep-alive ab -n100000 -c200 -k http://127.0.0.1:8787/ # 100000請(qǐng)求 200并發(fā) 未開(kāi)啟keep-alive ab -n100000 -c200 http://127.0.0.1:8787/
wrk
# 200 并發(fā)壓測(cè)10秒 開(kāi)啟keep-alive(默認(rèn)) wrk -c 200 -d 10s http://example.com
到此這篇關(guān)于PHP 超高性能可擴(kuò)展HTTP服務(wù)框架Webman的文章就介紹到這了,更多相關(guān)Webman框架內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
php面向?qū)ο笾械哪g(shù)方法中文說(shuō)明
這篇文章主要介紹了php面向?qū)ο笾械哪g(shù)方法中文說(shuō)明,明白這些方法才好寫(xiě)面向?qū)ο蟪绦?,需要的朋友可以參考?/div> 2014-03-03
手把手編寫(xiě)PHP框架 深入了解MVC運(yùn)行流程
手把手編寫(xiě)PHP框架,幫助大家深入了解MVC運(yùn)行流程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
PHP錯(cuò)誤處理函數(shù)register_shutdown_function使用示例
這篇文章主要介紹了PHP錯(cuò)誤處理函數(shù)register_shutdown_function使用示例,需要的朋友可以參考下2017-07-07
yii2 resetful 授權(quán)驗(yàn)證詳解
這篇文章主要介紹了yii2 resetful 授權(quán)驗(yàn)證詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
PHP中trait的使用和同時(shí)引入多個(gè)trait時(shí)同名方法沖突的處理方法
這篇文章主要介紹了PHP中trait的使用和同時(shí)引入多個(gè)trait時(shí)同名方法沖突的處理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
一個(gè)好用的PHP驗(yàn)證碼類(lèi)實(shí)例分享
這篇文章主要介紹了一個(gè)好用的PHP驗(yàn)證碼類(lèi)實(shí)例,有需要的朋友可以參考一下2013-12-12
yii使用bootstrap分頁(yè)樣式的實(shí)例
本篇文章主要介紹了yii使用bootstrap分頁(yè)樣式的實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01最新評(píng)論

