進(jìn)程管理-防止進(jìn)程成為僵尸進(jìn)程
創(chuàng)建好了進(jìn)程,那么怎么對(duì)子進(jìn)程進(jìn)行管理呢?
使用信號(hào),對(duì)子進(jìn)程的管理,一般有兩種情況:(推薦學(xué)習(xí):PHP編程從入門(mén)到精通)
posix_kill():此函數(shù)并不能顧名思義,它通過(guò)向子進(jìn)程發(fā)送一個(gè)信號(hào)來(lái)操作子進(jìn)程,在需要要時(shí)可以選擇給子進(jìn)程發(fā)送進(jìn)程終止信號(hào)來(lái)終止子進(jìn)程;
pcntl_waitpid():等待或返回fork的子進(jìn)程狀態(tài),如果指定的子進(jìn)程在此函數(shù)調(diào)用時(shí)已經(jīng)退出(俗稱(chēng)僵尸進(jìn)程),此函數(shù)將立刻返回,并釋放子進(jìn)程的所有系統(tǒng)資源,此進(jìn)程可以避免子進(jìn)程變成僵尸進(jìn)程,造成系統(tǒng)資源浪費(fèi);
孤兒進(jìn)程:父進(jìn)程掛了,子進(jìn)程被pid=1的init進(jìn)程接管(wait/waitpid),直到子進(jìn)程自身生命周期結(jié)束被系統(tǒng)回收資源和父進(jìn)程 采取相關(guān)的回收操作
僵尸進(jìn)程:子進(jìn)程exit退出,父進(jìn)程沒(méi)有通過(guò)wait/waitpid獲取子進(jìn)程狀態(tài),子進(jìn)程占用的進(jìn)程號(hào)等描述資源符還存在,產(chǎn)生危害:例如進(jìn)程號(hào)是有限的,無(wú)法釋放進(jìn)程號(hào)導(dǎo)致未來(lái)可能無(wú)進(jìn)程號(hào)可用
**父進(jìn)程中使用:pcntl_wait或者pcntl_waitpid的目的就是防止worker成為僵尸進(jìn)程
作用:使用pcntl_wait()后,在子進(jìn)程死掉后,父進(jìn)程也會(huì)被停止**
最后我們通過(guò)下圖來(lái)簡(jiǎn)單的總結(jié)和描述這個(gè)多進(jìn)程實(shí)現(xiàn)的過(guò)程:
進(jìn)程管理-進(jìn)程間通信
隊(duì)列:如Redis,推薦
socket:推薦
管道:實(shí)現(xiàn)復(fù)雜,且管道(pipe),使用文件形式存在,存在硬盤(pán)IO性能瓶頸
信號(hào):承載信息量少,不好管理
進(jìn)程管理-切換為守護(hù)進(jìn)程
使用&實(shí)現(xiàn)
php deadloop.php &