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