Workerman 網(wǎng)站是一個(gè)高性能的PHP socket 服務(wù)器框架,workerman基于PHP多進(jìn)程以及l(fā)ibevent事件輪詢庫,PHP開發(fā)者只要實(shí)現(xiàn)一兩個(gè)接口,便可以開發(fā)出自己的網(wǎng)絡(luò)應(yīng)用,例如Rpc服務(wù)、聊天室服務(wù)器、手機(jī)游戲服務(wù)器等。
workerman的目標(biāo)是讓PHP開發(fā)者更容易的開發(fā)出基于socket的高性能的應(yīng)用服務(wù),而不用去了解PHP socket以及PHP多進(jìn)程細(xì)節(jié)。 workerman本身是一個(gè)PHP多進(jìn)程服務(wù)器框架,具有PHP進(jìn)程管理以及socket通信的模塊,所以不依賴php-fpm、nginx或者apache等這些容器便可以獨(dú)立運(yùn)行。
workerman諸多的不同尋常的特性,使得PHP開發(fā)者可以開發(fā)出不同尋常的應(yīng)用程序:
1.純PHP開發(fā):workerman完全使用PHP開發(fā),使用workerman開發(fā)的應(yīng)用程序不依賴php-fpm、apache、nginx這些容器就可以獨(dú)立運(yùn)行。 這使得PHP開發(fā)者開發(fā)、部署、調(diào)試應(yīng)用程序非常方便。
2.支持PHP多進(jìn)程:為了充分發(fā)揮服務(wù)器多CPU的性能,workerman默認(rèn)支持多進(jìn)程多任務(wù)。workerman開啟一個(gè)主進(jìn)程和多個(gè)子進(jìn)程對(duì)外提供服務(wù), 主進(jìn)程負(fù)責(zé)監(jiān)控子進(jìn)程退出信號(hào),并負(fù)責(zé)生成新的子進(jìn)程去處理服務(wù),這樣做不僅提高了應(yīng)用程序的性能,而且使得workerman更加穩(wěn)定。
3.支持TCP、UDP:workerman支持TCP和UDP兩種傳輸層協(xié)議,只需要更改配置的一個(gè)字段,便可以更換傳輸層協(xié)議,業(yè)務(wù)代碼無需任何改動(dòng)。
4.支持長(zhǎng)連接:很多時(shí)候需要PHP應(yīng)用程序要與客戶端保持長(zhǎng)連接,比如聊天室、游戲等,但是傳統(tǒng)的PHP容器(apache、nginx、php-fpm)很難做到這一點(diǎn)。 使用workerman可以輕松使用PHP長(zhǎng)連接。php單個(gè)進(jìn)程可以支持幾千甚至幾萬的并發(fā)連接,多進(jìn)程則可支持?jǐn)?shù)十萬甚至上百萬的并發(fā)連接。
5.支持各種應(yīng)用層協(xié)議:接口上支持各種應(yīng)用層協(xié)議,包括自定義協(xié)議。Workerman默認(rèn)支持的協(xié)議有HTTP、WebSocket、以及簡(jiǎn)單的Text文本協(xié)議。 同時(shí)Workerman提供了通用的協(xié)議接口,開發(fā)者基于此接口便可以方便的開發(fā)出自己的協(xié)議。
6.支持高并發(fā):workerman支持Libevent事件輪詢庫(需要安裝Libevent擴(kuò)展), 使用Libevent在高并發(fā)時(shí)性能非常卓越,如果沒有安裝Libevent則使用PHP內(nèi)置的Select相關(guān)系統(tǒng)調(diào)用。
7.支持服務(wù)平滑重啟:當(dāng)需要重啟服務(wù)時(shí)(例如發(fā)布版本),我們不希望正在處理用戶請(qǐng)求的進(jìn)程被立刻終止,更不希望重啟的那一刻沒有足夠的進(jìn)程對(duì)外提供服務(wù), 為了保證任意時(shí)刻都有足夠的進(jìn)程對(duì)外提供服務(wù),則可以使用平滑重啟命令,平滑重啟過程中workerman會(huì)讓子進(jìn)程處理完請(qǐng)求后才退出, 并且能夠保證在任意時(shí)刻都有足夠的進(jìn)程對(duì)外服務(wù)。
8.支持文件更新檢測(cè)及自動(dòng)加載:基于workerman開發(fā)應(yīng)用程序過程中,我們希望在我們改動(dòng)代碼后能夠立刻生效,則只要你開啟配置中debug功能即可。 開啟后workerman會(huì)有一個(gè)單獨(dú)的進(jìn)程輪詢(因?yàn)镻HP在Mac系統(tǒng)無法使用linux內(nèi)核提供的Inotify機(jī)制,所以只好輪詢)應(yīng)用程序真實(shí)使用的所有PHP文件, 當(dāng)文件有更新時(shí),啟動(dòng)平滑重啟,自動(dòng)載入新的PHP文件。
9.支持以指定用戶運(yùn)行子進(jìn)程:因?yàn)樽舆M(jìn)程是實(shí)際處理用戶請(qǐng)求的進(jìn)程,為了安全考慮,子進(jìn)程不能有太高的權(quán)限,所以workerman支持設(shè)置子運(yùn)行進(jìn)程運(yùn)行的用戶。
10.自帶監(jiān)控:workerman內(nèi)部帶有監(jiān)控統(tǒng)計(jì)模塊,能夠統(tǒng)計(jì)workerman自身的一些數(shù)據(jù),如進(jìn)程退出次數(shù)及退出狀態(tài),每個(gè)進(jìn)程占用內(nèi)存大小及監(jiān)聽的ip端口、每個(gè)進(jìn)程啟動(dòng)時(shí)間、 進(jìn)程運(yùn)行的服務(wù)名、每個(gè)進(jìn)程處理請(qǐng)求數(shù)、連接數(shù)、數(shù)據(jù)包發(fā)送失敗量等等。這些信息可以本地運(yùn)行php start.php status本地查看。
11.支持毫秒級(jí)別定時(shí)器:支持毫秒級(jí)別定時(shí)器,可以做定時(shí)任務(wù)或者定時(shí)計(jì)算,如游戲中地圖上AI相關(guān)計(jì)算。
12.支持異步IO:Workerman自帶的網(wǎng)絡(luò)IO接口是異步的,開發(fā)者可實(shí)現(xiàn)基于事件的異步編程。
13.支持對(duì)象或者資源永久保持:在一個(gè)進(jìn)程生命周期內(nèi)靜態(tài)成員或者全局變量在不主動(dòng)銷毀的情況下是永久保持的,也就是只要初始化一次靜態(tài)成員或者全局變量則整個(gè)進(jìn)程生命周期內(nèi)的所有請(qǐng)求都可以復(fù)用這個(gè) 靜態(tài)成員或者全局變量。例如只要單個(gè)進(jìn)程內(nèi)初始化一次數(shù)據(jù)庫連接,則以后這個(gè)進(jìn)程的所有請(qǐng)求都可以復(fù)用這個(gè)數(shù)據(jù)庫連接,不用每個(gè)用戶請(qǐng)求都去重連數(shù)據(jù)庫,避免了頻繁連接數(shù)據(jù)庫過程中TCP三次握手、 數(shù)據(jù)庫權(quán)限驗(yàn)證、斷開連接時(shí)TCP四次握手的過程,極大的提高了應(yīng)用程序效率。memcache、redis等初始化也是同樣的道理。
14.高性能:由于php文件從磁盤讀取解析一次后便會(huì)常駐內(nèi)存,下次使用時(shí)直接使用內(nèi)存中的opcode, 極大的減少了磁盤IO及PHP中請(qǐng)求初始化、創(chuàng)建執(zhí)行環(huán)境、詞法解析、語法解析、編譯opcode、請(qǐng)求關(guān)閉等諸多耗時(shí)過程, 并且不依賴nginx、apache等容器,少了nginx等容器與PHP通信的網(wǎng)絡(luò)開銷,最主要的是資源可以永久保持,不必每次初始化數(shù)據(jù)庫連接等等, 所以使用workerman開發(fā)應(yīng)用程序,性能非常高。
15.諸多應(yīng)用:workerman擁有諸多的應(yīng)用,如Thrift-Rpc、Json-Rpc、 聊天室、統(tǒng)計(jì)監(jiān)控服務(wù)以及本站W(wǎng)eb程序等. 目前workerman已經(jīng)被多家公司使用,其中不乏日營(yíng)業(yè)額過億的電子商務(wù)公司用戶訂單系統(tǒng)的開發(fā),以及大型游戲公司用于游戲后臺(tái)的開發(fā)。
16.支持分布式部署:WorkerMan支持分布式部署,可以平滑的動(dòng)態(tài)添加減少服務(wù)器而不影響服務(wù)質(zhì)量。從而使得WorkerMan集群能夠支持相當(dāng)大的吞吐量或者并發(fā)TCP連接。
17.支持HHVM:支持HHVM,對(duì)于php性能有大幅度(一般為50%左右甚至更高)的提升,尤其是在cpu密集運(yùn)算中。實(shí)際經(jīng)過壓力測(cè)試確實(shí)有明顯性能提升效果。
18.支持心跳檢測(cè):Gateway/Worker開發(fā)模型支持服務(wù)端的心跳檢測(cè),可以定時(shí)向客戶端發(fā)送應(yīng)用層的心跳,能夠及時(shí)檢測(cè)到客戶端極端掉線情況(掉電、突發(fā)網(wǎng)絡(luò)故障等)。