源碼中?php start.php reload 命令
??case 'reload':
? ? ? ? ? ? ? ? if($command2 === '-g'){
? ? ? ? ? ? ? ? ? ? $sig = SIGQUIT;
? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? $sig = SIGUSR1;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? posix_kill($master_pid, $sig);
? ? ? ? ? ? ? ? exit;
發(fā)起信號后緊跟這exit,這樣整個程序不是退出了嗎,為什么還能重啟
我想你是理解偏了,php start.php reload? 有兩層含義:
1、當(dāng)前發(fā)出reload指令后,本組進(jìn)程【假定是A】向當(dāng)前進(jìn)程組【假定是B】的主進(jìn)程發(fā)送對應(yīng)的$sig信號,然后A退出,A的職責(zé)完成。【注意:A和B完全是不同的兩組進(jìn)程空間】
2、B的主進(jìn)程接收到信號以后,再繼續(xù)逐個的分發(fā)$sig信號給B名下的各個子進(jìn)程,從而完成子進(jìn)程的平滑 reload,即一個一個的來的,退一個啟一個,......,如此反復(fù)直到全部重啟完為止。
blogdaren 大哥,我把KILL_WORKER_TIMER_TIME修改成10s,然后onmessage里sleep 10s ,發(fā)送個請求,然后立刻執(zhí)行reload,master收到10后向其子進(jìn)程發(fā)10 信號,子進(jìn)程為什么沒被打斷呢,在代碼里沒看到用pcntl_sigprocmask 阻塞信號啊,怎么做到的呢?
1、假如 KILL_WORKER_TIMER_TIME = 10: 指的是子進(jìn)程在沒有正常退出的情況下,10秒之后會被主進(jìn)程強(qiáng)制干掉,即發(fā)送的是 kill -9 信號給子進(jìn)程(這個設(shè)置和你后面的描述也沒啥邏輯關(guān)系);
2、(子進(jìn)程沒有被打斷?不知道你理解的啥意思)這么說吧:主進(jìn)程發(fā)送reload給子進(jìn)程以后,子進(jìn)程的sleep系統(tǒng)調(diào)用會立即被中斷,然后子進(jìn)程退出,然后主進(jìn)程立即會補(bǔ)充一個新的子進(jìn)程進(jìn)來。(根據(jù)你的測試思路我也論證了下,沒沒問題的)