當(dāng) reusePort=true 時,listen() 在子進(jìn)程中執(zhí)行;當(dāng) reusePort=false 時,listen() 在主進(jìn)程執(zhí)行。
如果系統(tǒng)不支持 reusePort:
1)listen() 改為在子進(jìn)程中執(zhí)行,有什么區(qū)別?
2)執(zhí)行?stream_context_set_option($this->context, 'socket', 'so_reuseport', 1);? 會產(chǎn)生不良結(jié)果嗎?
?
1、true === reusePort 代表啟用端口復(fù)用,正常情況下不同的多個進(jìn)程是無法綁定監(jiān)聽同一個端口的,但是啟用端口復(fù)用可以允許多個不同的進(jìn)程監(jiān)聽同一個端口,而且會避免驚群效應(yīng)。但啟用的前提是PHP_VERSION >= 7.0
2、?stream_context_set_option($this->context, 'socket', 'so_reuseport', 1) 這是針對 socket 啟用端口復(fù)用時的一個必備選項設(shè)置而已。
若操作系統(tǒng)版本過低不支持端口復(fù)用,強行將 reusePort 設(shè)置為 true,workerman 能正常運行嗎?
其實還是那兩個問題,系統(tǒng)不支持端口復(fù)用:
1.子進(jìn)程不fork父進(jìn)程的listen(父進(jìn)程不listen),而是自己單獨listen,可以嗎?
1.子進(jìn)程強行設(shè)置 stream_context_set_option($this->context, 'socket', 'so_reuseport', 1),workerman 能正常運行嗎?
無法正常運行,你試下就知道了。如果不支持端口復(fù)用,那么多進(jìn)程模型下,默認(rèn)記住是默認(rèn)不同的子進(jìn)程是不允許單獨listen監(jiān)聽同一個端口的,這個上面已經(jīng)提及過;另外是父進(jìn)程fork,不是子進(jìn)程fork,子進(jìn)程是繼承父進(jìn)程fork出來的listen套接字,這也是workerman在非端口復(fù)用機制下實現(xiàn)不同的子進(jìn)程監(jiān)聽同一個端口的原理所在。
@6972: 具體哪個進(jìn)程受理當(dāng)前連接這是由系統(tǒng)內(nèi)核調(diào)度的,單進(jìn)程內(nèi)是串行受理的,多核多進(jìn)程是可以看做是并行處理的。