圖片來(lái)自互聯(lián)網(wǎng),侵權(quán)請(qǐng)聯(lián)系刪除
1.為什么你要用swoole,能解決你項(xiàng)目中的哪些痛點(diǎn)?
swoole是一個(gè)網(wǎng)絡(luò)通訊和異步IO的引擎,一個(gè)基礎(chǔ)庫(kù);
swoole相比于apache/fpm,主要節(jié)省了PHP框架和全局對(duì)象每次創(chuàng)建銷(xiāo)毀帶來(lái)的性能開(kāi)銷(xiāo),是進(jìn)程常駐內(nèi)存型。
2.你是如何通過(guò)swoole提升性能的,怎么做的?
(1).進(jìn)程常駐內(nèi)存:
swoole本身是進(jìn)程常駐內(nèi)存,在進(jìn)程啟動(dòng)的時(shí)候就將PHP框架等代碼讀取并編譯完成,不需要每次啟動(dòng)的時(shí)候都執(zhí)行編譯步驟,大大降低了腳本的運(yùn)行時(shí)間;
(2).連接池
php-fpm的模式php因?yàn)槊看握?qǐng)求結(jié)束時(shí)都會(huì)銷(xiāo)毀所有資源,因此無(wú)法使用連接池;而基于swoole的進(jìn)程常駐內(nèi)存模式,可以通過(guò)連接池的方式來(lái)加速程序,
使用連接池既可以降低程序的響應(yīng)時(shí)間,又可以有效保護(hù)后端資源。
(3).可以使用協(xié)程處理異步IO
當(dāng)開(kāi)發(fā)中需要去請(qǐng)求多處的數(shù)據(jù),而每一塊的數(shù)據(jù)單獨(dú)請(qǐng)求都要花較長(zhǎng)時(shí)間,常規(guī)的php-fpm是阻塞式運(yùn)行,無(wú)法對(duì)這類(lèi)型的數(shù)據(jù)處理進(jìn)行加速;而基于swoole的程序,可以將這類(lèi)的業(yè)務(wù)并行化處理,并行去請(qǐng)求后端的數(shù)據(jù)源,能夠大大優(yōu)化了此類(lèi)業(yè)務(wù)的運(yùn)行時(shí)間。
3.swoole里的協(xié)程是什么,怎么用?為什么協(xié)程可以提高并發(fā)?
協(xié)程是通過(guò)協(xié)作而不是搶占的方式來(lái)進(jìn)行切換,它創(chuàng)建和切換對(duì)內(nèi)存等資源比線(xiàn)程小的多(可以理解為更小的線(xiàn)程);
協(xié)程的使用是通過(guò)Swoole\Coroutine或者Co\命名空間短命名簡(jiǎn)化類(lèi)名來(lái)創(chuàng)建;
協(xié)程可以異步處理任務(wù),支持并發(fā),并且資源消耗小。
4.用了swoole以后,會(huì)不會(huì)發(fā)生內(nèi)存泄漏?如果發(fā)生了怎么解決?
swoole由于是常駐內(nèi)存,一旦資源加載進(jìn)入后,會(huì)一直存在于內(nèi)存中。對(duì)于局部變量,swoole會(huì)在回調(diào)函數(shù)結(jié)束后自動(dòng)釋放;對(duì)于全局變量(lobal聲明的變量,
static聲明的對(duì)象屬性或者函數(shù)內(nèi)的靜態(tài)變量和超全局變量),swoole不會(huì)自動(dòng)釋放;因此操作不好會(huì)發(fā)生內(nèi)存泄漏。
解決:
(1).在onClose回調(diào)內(nèi)清理變量;
(2).swoole提供了max_request和max_task_request機(jī)制:進(jìn)程完成指定數(shù)量的任務(wù)后,會(huì)自動(dòng)退出,達(dá)到釋放資源和內(nèi)存的目的;而后manager進(jìn)程會(huì)重新拉起新worker/task進(jìn)程來(lái)繼續(xù)處理任務(wù)。
使用限制:
max_request只能用于同步阻塞、無(wú)狀態(tài)的請(qǐng)求響應(yīng)式服務(wù)器程序;
純異步的Server不應(yīng)當(dāng)設(shè)置max_request
使用Base模式時(shí)max_request是無(wú)效的