PHP進程間通訊的另外一個手段就是通過訊號來在進程間傳遞信息。訊號是一種系統調用,一般我們用的kill命令就是發送某個訊號給某個進程的。
在開發服務器端守護進程方面,訊號處理至關重要。PHP的pcntl擴充提供了訊號處理的功能,借助它可以讓PHP來接管訊號的處理。
明天,我們就來給你們講一講PHP中的訊號處理。
哪些是訊號?
訊號是風波發生時對進程的通知機制,有時又稱為軟件中斷。一個進程可以向另一個進程發送訊號,例如子進程結束時就會向父進程發送一個(17號訊號)來通知父進程信號與信息處理,所以有時訊號也被當成一種進程間通訊的機制。
訊號的形成是有多種方法的,下邊是常見的幾種:
●鍵盤上按個別組合鍵,例如Ctrl+C或則Ctrl+D等,會形成訊號。
●使用posixkill調用,可以向某個進程發送指定的訊號。
●遠程ssh終端情況下,假如你在服務器上執行了一個阻塞的腳本,正在阻塞過程中你關掉了終端,可能還會形成訊號。
●硬件也會形成訊號,例如OOM了或則遇見除0這些情況,硬件也會向進程發送特定訊號。
而進程在收到訊號后,可以有如下三種響應:
●直接忽視,不做任何反映。就是俗名的完全不鳥。并且有兩種訊號,永遠不會被忽視,一個是,另一個是,由于這兩個進程提供了向內核最后的可靠的結束進程的辦法。
●捕捉訊號并做出相應的一些反應,具體響應哪些可以由用戶自己通過程序自定義。
●系統默認響應。大多數進程在碰到訊號后,假如用戶也沒有自定義響應,這么都會采取系統默認響應,大多數的系統默認響應就是中止進程。
PHP訊號處理案例
我們在FPM模式下寫代碼,不會碰到訊號處理相關的問題,而且CLI模式下一些常駐顯存的腳本,怎么還能自由的重啟、關閉、退出前做一些清除工作(斷掉鏈接,刪掉臨時文件等)?
是PHP的訊號處理注冊方式,這個是pcntl初始化的時侯,將h注冊為tick的處理函數。
會將處理函數放在訊號集合中(PHP的hashtable),而最終會調用進行底層的訊號管理。
這兒我省略了大量代碼,將關鍵的點標記了下來,雖然PHP維護一個自己的訊號集合,每每調用h時才會查詢是否有訊號信號與信息處理,里面的會將訊號阻塞,這樣只有我們把關鍵的代碼執行完畢以后,再去觸發訊號處理函數以保證數據和程序邏輯的完整性。
PHP怎么高貴的處理訊號
常常看到身邊的程序員們,每每須要重啟PHP-FPM進程的時侯,使用的招式是kill掉所有PHP進程,之后新啟動。通常情況沒啥問題,但有些時侯可能某個進程的任務還沒執行完,直接把人家中斷了略顯粗魯。
雖然只要你給PHP的進程發送一條USR2訊號,它便會再處理完所有任務后,重啟子進程,這才是所謂的高貴~
以上圖為例,假如我們想讓進程高貴退出的時侯,只須要發送訊號即可。須要注意的是和訊號會略過訊號阻塞會將進程直接停止,還有就是訊號會中斷睡眠(SLEEP),sleep倘若沒執行完會返回剩下的秒數。
訊號相關的知識點雖然有好多,還須要你們在平常的使用中繼續深入研究。以上就是這篇文章的全部內容,希望能對你們有所幫助。