swoole框架是一個(gè)很神奇很厲害的框架,它彌補(bǔ)了PHP的本身的一些不足之處。其實(shí)swoole確切的說(shuō)是一個(gè)使用C語(yǔ)言編寫(xiě)的PHP擴(kuò)展,Swoole中的網(wǎng)絡(luò)請(qǐng)求處理是基于事件的,并且充分利用了底層的epoll / kqueue實(shí)現(xiàn),使得為數(shù)百萬(wàn)個(gè)請(qǐng)求提供服務(wù)變得非常容易,但也因此這個(gè)擴(kuò)展不能夠在windows系統(tǒng)使用。
Swoole4使用全新的協(xié)程內(nèi)核引擎,現(xiàn)在它擁有一個(gè)全職的開(kāi)發(fā)團(tuán)隊(duì),因此我們正在進(jìn)入PHP歷史上前所未有的時(shí)期,為性能的高速提升提供了獨(dú)一無(wú)二的可能性。
協(xié)程
Swoole4或更高版本擁有高可用性的內(nèi)置協(xié)程,您可以使用完全同步的代碼來(lái)實(shí)現(xiàn)異步性能,PHP代碼沒(méi)有任何額外的關(guān)鍵字,底層會(huì)自動(dòng)進(jìn)行協(xié)程調(diào)度。
開(kāi)發(fā)者可以將協(xié)程理解為超輕量級(jí)的線程, 你可以非常容易地在一個(gè)進(jìn)程中創(chuàng)建成千上萬(wàn)個(gè)協(xié)程。
swoole提升性能的幾個(gè)特性。
1·系統(tǒng)常駐內(nèi)存
基于swoole的程序是常駐內(nèi)存的程序,在啟動(dòng)時(shí)就將系統(tǒng)框架等代碼讀取并編譯完成,不需要每次請(qǐng)求時(shí)都執(zhí)行編譯的步驟,可以大大的降低腳本的運(yùn)行時(shí)間。
2·連接池
php-fpm 模式的php因?yàn)槊看?請(qǐng)求結(jié)束時(shí)都會(huì)銷(xiāo)毀所有的資源,所以無(wú)法正常使用連接池。但是基于swoole的程序是常駐內(nèi)存模式,可以通過(guò)連接池的方式來(lái)加速程序。使用連接池一方面可以降低程序的響應(yīng)時(shí)間,同時(shí)可以有效的保護(hù)后端資源。
3·可以利用協(xié)程處理后端的并行io
我們開(kāi)發(fā)的時(shí)候經(jīng)常會(huì)遇到一個(gè)請(qǐng)求要查詢多塊數(shù)據(jù),每個(gè)數(shù)據(jù)之間都需要占用比較長(zhǎng)的時(shí)間,常規(guī)的php-fpm模式因?yàn)槭亲枞J竭\(yùn)行,無(wú)法對(duì)這類(lèi)業(yè)務(wù)進(jìn)行很好的加速。但是基于swoole的程序,可以將這類(lèi)請(qǐng)求協(xié)程化處理,并行的去請(qǐng)求后端數(shù)據(jù)源,將原本sum(a+b+c)的時(shí)間變成接近max(a, b, c)。能夠大大的優(yōu)化此類(lèi)業(yè)務(wù)。
swoole可以提高php系統(tǒng)性能和并發(fā)性能,可以提高php接口性能,讓php可以勝任后端接口的服務(wù)。
Swoole比Node.js有哪些優(yōu)勢(shì)?
多核并行
node.js的event loop是單進(jìn)程單線程的,只有一個(gè)epoll/kqueue事件輪詢被執(zhí)行。所以無(wú)法利用到多核的計(jì)算優(yōu)勢(shì)。
swoole的event loop是多線程的,是基于epoll/kqueue的Multi-Reactor模型。這點(diǎn)與nginx/golang相同。另外swoole的多線程Reactor之間不存在鎖,這點(diǎn)與nginx不同。它啟用了專門(mén)的accept線程,類(lèi)似與JAVA的netty。
所以在多核CPU的機(jī)器上,node.js對(duì)網(wǎng)絡(luò)IO事件的處理能力絕對(duì)是要差swoole數(shù)倍的,在4核的機(jī)器上至少要查2-3倍。
雖然node.js也提供了多線程的擴(kuò)展,但對(duì)于event_loop來(lái)說(shuō)必須是內(nèi)核提供,擴(kuò)展不行的。
另外node.js未來(lái)是否會(huì)改造成為多線程Reactor,我估計(jì)不會(huì),這不是技術(shù)上的難題。而是一旦改成多線程Reactor,node.js恐怕就不是node.js了。失去了原來(lái)單線程的各種優(yōu)勢(shì)后,反而會(huì)一無(wú)是處。當(dāng)然可能node.js官方開(kāi)發(fā)組會(huì)思考出解決問(wèn)題的巧妙辦法,一切都是后話了。
不只是event_loop,執(zhí)行用戶層代碼是也是單線程的,不能利用多核計(jì)算優(yōu)勢(shì)。需要用戶自己去fork多進(jìn)程或者創(chuàng)建線程池。使用難度增加了很多。不像swoole,配置一下參數(shù)即可,是天然多進(jìn)程。
異步網(wǎng)絡(luò)IO
node.js和swoole都是基于epoll/kqueue實(shí)現(xiàn)的全異步非阻塞IO,所以這方面大同小異,沒(méi)有差別。維持TCP長(zhǎng)連接的能力是一樣的。
node.js在這里有一個(gè)優(yōu)勢(shì)就是它支持windows的IOCP。swoole僅支持Linux/FreeBSD/MacOS的epoll/kqueue.
異步文件讀寫(xiě)
node.js和swoole都提供了基于線程池的異步文件讀寫(xiě),DNS查詢功能。node.js最早基于libeio實(shí)現(xiàn),后來(lái)才自行實(shí)現(xiàn)線程池。swoole一開(kāi)始就基于線程池設(shè)計(jì)的。
實(shí)際上這里都是通過(guò)多線程阻塞來(lái)模擬的,并非真正的異步讀寫(xiě)文件。比如同時(shí)讀寫(xiě)數(shù)百個(gè)文件時(shí),性能遠(yuǎn)不如普通的多進(jìn)程PHP程序。
swoole中還提供了Linux Native AIO的支持,是真正的內(nèi)核層異步并行文件讀寫(xiě),不過(guò)需要通過(guò)修改宏開(kāi)關(guān),重新編譯才可以使用。
最后結(jié)論
node.js和swoole比沒(méi)有明顯優(yōu)勢(shì),僅在Windows支持方面比swoole要好。node.js中有的特性swoole中都有。個(gè)人認(rèn)為Node.js最大的優(yōu)勢(shì)在于:
node.js使用JavaScript語(yǔ)言,與瀏覽器、HTML之間的融合度非常高,使用同一種語(yǔ)言既寫(xiě)前端又寫(xiě)后端
支持Windows平臺(tái),利用node-webkit,可以開(kāi)發(fā)PC客戶端軟件
node.js的定位應(yīng)該是前端與后端結(jié)合非常緊密的應(yīng)用場(chǎng)景。如websocket推送,JSON-RPC,輕量級(jí)HTTP接口。
而對(duì)于真正專業(yè)的后端領(lǐng)域,分布式系統(tǒng),node.js不適合。
留言反饋