摘要:和內(nèi)容無(wú)關(guān)的主題什么是信號(hào)信號(hào)就是事件發(fā)生時(shí),對(duì)進(jìn)程的一種通知機(jī)制也叫軟件中斷。當(dāng)一個(gè)進(jìn)程收到信號(hào)后,內(nèi)核會(huì)暫停該進(jìn)程正在執(zhí)行的代碼,并跳轉(zhuǎn)到對(duì)應(yīng)的信號(hào)處理函數(shù)中,如果處理函數(shù)不中斷,執(zhí)行完處理函數(shù)后,會(huì)繼續(xù)執(zhí)行之前中斷的地方往下執(zhí)行。
今天晚上吃鹵煮,領(lǐng)桌的妹子問(wèn)我,這玩意兒能吃么?我:你覺(jué)得能吃就能吃。。。和內(nèi)容無(wú)關(guān)的主題什么是信號(hào)
信號(hào)就是事件發(fā)生時(shí),對(duì)進(jìn)程的一種通知機(jī)制(也叫軟件中斷)。當(dāng)一個(gè)進(jìn)程收到信號(hào)后,內(nèi)核會(huì)暫停該進(jìn)程正在執(zhí)行的代碼,并跳轉(zhuǎn)到對(duì)應(yīng)的信號(hào)處理函數(shù)中,如果處理函數(shù)不中斷,執(zhí)行完處理函數(shù)后,會(huì)繼續(xù)執(zhí)行之前中斷的地方往下執(zhí)行。
我們?cè)贔PM模式下寫(xiě)代碼,不會(huì)遇到信號(hào)處理相關(guān)的問(wèn)題,但是CLI模式下一些常駐內(nèi)存的腳本,如何能夠自由的重啟、關(guān)閉、退出前做一些清理工作(斷開(kāi)鏈接,刪除臨時(shí)文件等)?
C的信號(hào)處理舉例上圖中,我為信號(hào)SIGINT注冊(cè)了處理函數(shù)sigint_handle,捕獲到信號(hào)后,輸出內(nèi)容后退出,簡(jiǎn)單易懂吧。執(zhí)行 gcc -o run run.c && ./run ,然后CTRL+C(會(huì)觸發(fā)SIGINT信號(hào)),成功輸出:成功捕獲到信號(hào)2!,程序直接結(jié)束運(yùn)行。
PHP的信號(hào)處理舉例pcntl_signal是PHP的信號(hào)處理注冊(cè)方法,上面實(shí)現(xiàn)的功能和C實(shí)現(xiàn)的基本一致,不同的是,當(dāng)前進(jìn)程不會(huì)退出,并且多輸出了一個(gè)signinfo(PHP是C寫(xiě)的,為啥剛剛C語(yǔ)言的沒(méi)有信號(hào)相關(guān)的信息呢?因?yàn)镻HP使用的是另一個(gè)信號(hào)函數(shù)sigaction,有興趣的可以了解一下)
PHP的信號(hào)處理并不是直接調(diào)用C這個(gè)是pcntl初始化的時(shí)候,將pcntl_signal_dispatch注冊(cè)為tick的處理函數(shù)
pcntl_signal會(huì)將處理函數(shù)放到信號(hào)集合中(PHP的hash table),而php_signale4最終會(huì)調(diào)用sigaction進(jìn)行底層的信號(hào)管理。
這里我省略了大量代碼,將關(guān)鍵的點(diǎn)標(biāo)記了出來(lái),其實(shí)PHP維護(hù)一個(gè)自己的信號(hào)集合,每當(dāng)調(diào)用pcntl_signal_dispatch時(shí)就會(huì)查詢(xún)是否有信號(hào),上面的SIG_BLOCK會(huì)將信號(hào)阻塞,這樣只有我們把關(guān)鍵的代碼執(zhí)行完畢之后,再去觸發(fā)信號(hào)處理函數(shù)以保證數(shù)據(jù)和程序邏輯的完整性。
經(jīng)常見(jiàn)到身邊的程序員們,每當(dāng)需要重啟PHP-FPM進(jìn)程的時(shí)候,使用的招數(shù)是kill掉所有PHP進(jìn)程,然后新啟動(dòng)。一般情況沒(méi)啥問(wèn)題,但有些時(shí)候可能某個(gè)進(jìn)程的任務(wù)還沒(méi)執(zhí)行完,直接把人家中斷了略顯粗暴。其實(shí)只要你給PHP的Master進(jìn)程發(fā)送一條USR2信號(hào),它便會(huì)再處理完所有任務(wù)后,重啟子進(jìn)程,這才是所謂的優(yōu)雅~
上圖是我簡(jiǎn)單寫(xiě)的一個(gè)例子,如果我們想讓進(jìn)程優(yōu)雅退出的時(shí)候,只需要發(fā)送SIGTERM信號(hào)即可。需要注意的是SIGKILL和SIGSTOP信號(hào)會(huì)略過(guò)信號(hào)阻塞會(huì)將進(jìn)程直接停止,還有就是信號(hào)會(huì)中斷睡眠(SLEEP),sleep如果沒(méi)執(zhí)行完會(huì)返回剩下的秒數(shù),有興趣可以試試。
信號(hào)相關(guān)的知識(shí)點(diǎn)其實(shí)有很多,還需要繼續(xù)深入研究~上文中的PHP源碼為7.1.25版本,各個(gè)版本可能不太一樣。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/29880.html
摘要:貢獻(xiàn)者飛龍版本最近總是有人問(wèn)我,把這些資料看完一遍要用多長(zhǎng)時(shí)間,如果你一本書(shū)一本書(shū)看的話(huà),的確要用很長(zhǎng)時(shí)間。為了方便大家,我就把每本書(shū)的章節(jié)拆開(kāi),再按照知識(shí)點(diǎn)合并,手動(dòng)整理了這個(gè)知識(shí)樹(shù)。 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=200); 貢獻(xiàn)者:飛龍版...
摘要:最適合入門(mén)的初級(jí)教程一為什么選擇曾經(jīng)要跟白頭到老沒(méi)想到它升了個(gè)級(jí)就拋了錨把我等拋棄了痛定思痛重新審視了一遍框架是世界上最好的語(yǔ)言這個(gè)沒(méi)有疑問(wèn)吧如果有那絕對(duì)是個(gè)異教徒這是要被拖出去燒死的信仰的問(wèn)題神圣不可侵犯那最好的語(yǔ)言中最流行的框架是哪個(gè)呢 最適合入門(mén)的 Laravel 初級(jí)教程 (一) 為什么選擇 laravel 曾經(jīng)要跟 thinkphp 白頭到老;沒(méi)想到它升了個(gè)級(jí)就拋了錨;把我等...
摘要:不過(guò)細(xì)想想,我郵只有前端的選修課啥的,課程也不是那么就業(yè)導(dǎo)向。至少目前,很少有大公司完全把作為前后端通用的技術(shù)棧。不能把簡(jiǎn)單看做是在服務(wù)端的延展。編譯這個(gè)思想在前端領(lǐng)域很重要不改變現(xiàn)有的語(yǔ)言環(huán)境同時(shí)進(jìn)行最佳的工程實(shí)踐。 P.S. 噴神請(qǐng)繞道,大神勿噴,不引戰(zhàn),不攻擊,不鉆牛角尖。 大二時(shí)第一次接觸前端。許多同學(xué)估計(jì)都想過(guò)要做一個(gè)網(wǎng)站,大部分又是從PHP開(kāi)始的(誰(shuí)讓它是世界上最好的語(yǔ)言呢...
摘要:如果在學(xué)習(xí)過(guò)程中有什么問(wèn)題可以關(guān)注我公眾號(hào)琉憶編程庫(kù)給我留言。有興趣可以深入學(xué)習(xí)最后附上學(xué)習(xí)的知識(shí)結(jié)構(gòu)圖譜,可以按著下面的這個(gè)知識(shí)結(jié)構(gòu)圖進(jìn)行學(xué)習(xí)不一定完整,更多資料,面試題,都可以關(guān)注公眾號(hào)琉憶編程庫(kù)獲取。 你好,是我——琉憶。PHP程序員面試系列圖書(shū)作者。 作為一名PHP開(kāi)發(fā)者過(guò)來(lái)人,也是經(jīng)歷了菜鳥(niǎo)到老手的過(guò)程,在此給那些想學(xué)PHP的同學(xué)指條路,即使你是轉(zhuǎn)行學(xué)PHP一樣可以學(xué)會(huì)PHP...
閱讀 3653·2021-10-15 09:43
閱讀 3554·2021-09-02 15:21
閱讀 2267·2021-08-11 11:23
閱讀 3307·2019-08-30 15:54
閱讀 1994·2019-08-30 13:54
閱讀 3263·2019-08-29 18:35
閱讀 732·2019-08-29 16:58
閱讀 1823·2019-08-29 12:49