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