?
這種模式就是傳統(tǒng)的異步非阻塞Server。與nginx和Node.JS等程序是完全一致的。? ? ? ? ? ? ? (推薦學(xué)習(xí): swoole視頻教程)
在時(shí)間循環(huán)中直接回調(diào)php的函數(shù),而不是dispatch投遞任務(wù)。如果回調(diào)函數(shù)中有阻塞操作會(huì)導(dǎo)致Server退化為同步模式。worker_num參數(shù)對(duì)與BASE模式仍然有效,會(huì)啟動(dòng)多個(gè)Worker進(jìn)程。
BASE模式下沒(méi)有Master進(jìn)程的角色
每個(gè)Worker進(jìn)程同時(shí)承擔(dān)了Process模式下Reactor線程和Worker進(jìn)程兩部分職責(zé)
BASE模式下Manager進(jìn)程是可選的,當(dāng)設(shè)置了worker_num=1,并且沒(méi)有使用Task和MaxRequest特性時(shí),底層將直接創(chuàng)建一個(gè)單獨(dú)的Worker進(jìn)程,不創(chuàng)建Manager進(jìn)程
BASE模式的優(yōu)點(diǎn):
BASE模式?jīng)]有IPC開銷,性能更好
BASE模式代碼更簡(jiǎn)單,不容易出錯(cuò)
BASE模式的缺點(diǎn):
TCP連接是在Worker進(jìn)程中維持的,所以當(dāng)某個(gè)Worker進(jìn)程掛掉時(shí),此Worker內(nèi)的所有連接都將被關(guān)閉
少量TCP長(zhǎng)連接無(wú)法利用到所有Worker進(jìn)程
TCP連接與Worker是綁定的,長(zhǎng)連接應(yīng)用中某些連接的數(shù)據(jù)量大,這些連接所在的Worker進(jìn)程負(fù)載會(huì)非常高。但某些連接數(shù)據(jù)量小,所以在Worker進(jìn)程的負(fù)載會(huì)非常低,不同的Worker進(jìn)程無(wú)法實(shí)現(xiàn)均衡。
BASE模式的適用場(chǎng)景:
如果客戶端連接之間不需要交互,可以使用BASE模式。如memcache、http服務(wù)器等。
進(jìn)程模式(SWOOLE_PROCESS)
多進(jìn)程模式是最復(fù)雜的方式,用了大量的進(jìn)程間通信、進(jìn)程管理機(jī)制。適合業(yè)務(wù)邏輯非常復(fù)雜的場(chǎng)景。Swoole提供了完善的進(jìn)程管理、內(nèi)存保護(hù)機(jī)制。 在業(yè)務(wù)邏輯非常復(fù)雜的情況下,也可以長(zhǎng)期穩(wěn)定運(yùn)行。
Swoole在Reactor線程中提供了Buffer的功能,可以應(yīng)對(duì)大量慢速連接和逐字節(jié)的惡意客戶端。另外也提供了CPU親和設(shè)置選項(xiàng),使程序運(yùn)行的效率更好。
進(jìn)程模式的優(yōu)點(diǎn):
連接與數(shù)據(jù)請(qǐng)求發(fā)送是分離的,不會(huì)因?yàn)槟承┻B接數(shù)據(jù)量大某些連接數(shù)據(jù)量小導(dǎo)致Worker進(jìn)程不均衡
Worker進(jìn)程發(fā)送致命錯(cuò)誤時(shí),連接并不會(huì)被切斷
可實(shí)現(xiàn)單連接并發(fā),僅保持少量TCP連接,請(qǐng)求可以并發(fā)地在多個(gè)Worker進(jìn)程中處理
進(jìn)程模式的缺點(diǎn):
存在2次IPC的開銷,master進(jìn)程與worker進(jìn)程需要使用UnixSocket進(jìn)行通信
不支持某些高級(jí)功能,如sendwait、pause、resume等操作