2010-10-13 76 views
3

我發現的代碼塊,我以前從未見過的:PHP:什麼是pcntl_signal用於?

declare(ticks = 1); 
pcntl_signal(SIGINT, array($this, "catchSignal")); 
pcntl_signal(SIGTERM, array($this, "catchSignal")); 

我的PHP文件中查找的功能,但我還是不明白這是什麼用途。請幫我理解這是什麼用途以及應該在哪裏實施的例子。

+0

相關最新:http://stackoverflow.com/questions/3909798/register-php-shutdown-function-to-fire-when-a-script-is-killed-from-the-command-l/3909860# 3909860 – 2010-10-13 17:41:40

回答

5

聲明聲明聲明每個「打勾」檢查事件。 「tick」大致等於一行代碼。這用於命令行PHP腳本,因此您可以捕捉中斷並優雅地關閉腳本而不是將其殺死。

pcntl_signal函數中的array($this, "catchSignal")是一個奇怪的工作(在我看來)支持「對象」作爲參數。通常你只要做$this->catchSignal(),但PHP在這種情況下不接受類對象作爲參數。因此,「數組」的語法。

基本上,如果腳本發出中斷或終止信號,請在關閉之前調用$this->catchSignal()函數。

+0

什麼會歸類爲「中斷」或「終止」信號? – Andrew 2010-10-13 23:45:15

+0

在這種情況下,這些都是Unix術語。 SIGINT是一箇中斷。你的程序可以「捕捉」它並做一些事情。例如,「你確定要停止嗎?」。 SIGTERM是一個終止命令。基本上,現在退出。你可以「抓住」它並在退出之前進行清理。 SIGKILL只是殺死一個程序。 http://en.wikipedia.org/wiki/Kill_(command) – 2010-10-14 01:47:04

3

它用於安裝signal處理程序。我可以說的任何其他事情只會重複這篇文章。

3

瞭解信號處理的主要問題是它是操作系統的陷阱。因此,它可能發生在代碼的正常執行路徑之外,當它可能正在做其他事情時會中斷它。例如,如果你在* nix中控制-c,它通常會殺死正在運行的程序。但是如果該計劃正在做一些敏感的事情,那麼立即停止可能是一個壞主意。因此,一個持久的程序將以不同的方式處理一個kill信號;在終止它的執行之前,優雅地停止它正在做的事情。

pcntl_signal是在PHP中執行此操作的方式。