(PHP 4 >= 4.1.0, PHP 5)
pcntl_signal — 安裝一個信號處理器
說明
bool pcntl_signal ( int$signo
, callback $handler
[, bool $restart_syscalls
= true
] )
函數pcntl_signal()為signo
指定的信號安裝一個新
的信號處理器。
參數
signo
信號編號。
handler
信號處理器可以是用戶創建的函數或方法的名字,也可以是系統常量
SIG_IGN
(譯注:忽略信號處理程序)或SIG_DFL(默認信號處理程序)
.
Note:
注意當你使用一個對象方法的時候,該對象的引用計數回增加使得它在你改變為其他處理或腳本結束之前是持久存在的。
restart_syscalls
指定當信號到達時系統調用重啟是否可用。(譯注:經查資料,此參數意為系統調用被信號打斷時,系統調用是否從 開始處重新開始,但根據http://bugs.php.net/bug.php?id=52121,此參數存在bug無效。)
返回值
成功時返回 TRUE
, 或者在失敗時返回 FALSE
。
更新日志
版本
說明
4.3.0
增加參數restart_syscalls
。
4.3.0
對象方法可以作為回調被使用。
4.3.0
PCNTL現在使用了ticks作為信號處理的回調機制,ticks在速度上遠遠超過了之前的處理機制。
這個變化與“用戶ticks”遵循了相同的語義。您可以使用declare()
語句在程序中指定允許發生回調的位置。這使得我們對異步事件處理的開銷最小化。在編譯PHP時
啟用pcntl將始終承擔這種開銷,不論您的腳本中是否真正使用了pcntl。
PHP 4.3.0使用ticks作為信號處理回調機制,這比以前的機制快了很多。這個變化與
"用戶ticks"
遵循了相同的語義。您可以使用declare()
語句在程序中指定允許發生回調的位置。
范例
Example #1 pcntl_signal()示例
<?php
//使用ticks需要PHP 4.3.0以上版本
declare(ticks = 1);
//信號處理函數
function sig_handler($signo)
{
switch ($signo) {
case SIGTERM:
// 處理SIGTERM信號
exit;
break;
case SIGHUP:
//處理SIGHUP信號
break;
case SIGUSR1:
echo "Caught SIGUSR1...n";
break;
default:
// 處理所有其他信號
}
}
echo "Installing signal handler...n";
//安裝信號處理器
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");
// 或者在PHP 4.3.0以上版本可以使用對象方法
// pcntl_signal(SIGUSR1, array($obj, "do_something");
echo "Generating signal SIGTERM to self...n";
//向當前進程發送SIGUSR1信號
posix_kill(posix_getpid(), SIGUSR1);
echo "Donen"
?>
參見
pcntl_fork() - 在當前進程當前位置產生分支(子進程)。譯注:fork是創建了一個子進程,父進程和子進程 都從fork的位置開始向下繼續執行,不同的是父進程執行過程中,得到的fork返回值為子進程 號,而子進程得到的是0。 pcntl_waitpid() - 等待或返回fork的子進程狀態