(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
pcntl_signal — 安装信号处理程序
pcntl_signal() 函数为 signal
指定的信号安装新的信号处理程序或替换当前信号处理程序。
signal
信号编号。
handler
信号处理程序。要么是 callable,将调用它来处理信号,要么是全局常量 SIG_IGN
或
SIG_DFL
,将分别用于忽略信号或恢复默认信号处理程序。
如果指定为 callable,必须实现以下签名:
signal
siginfo
注意:
请注意,当处理程序设置为对象方法时,该对象的引用计数会增加,这会使其持续存在,直到将处理程序更改为其他内容或脚本结束为止。
restart_syscalls
指定当信号到达时系统调用重启是否可用。(译注:经查资料,此参数意为系统调用被信号打断时,系统调用是否从 开始处重新开始,但根据 http://bugs.php.net/bug.php?id=52121,此参数存在bug无效。)
版本 | 说明 |
---|---|
7.1.0 | 从 PHP 7.1.0 开始,处理程序 callback 指定为第二个参数,其中包含特定信号的 siginfo。仅当操作系统具有 siginfo_t 结构体时才提供此数据。如果操作系统未实现 siginfo_t,则提供 NULL。 |
示例 #1 pcntl_signal() 示例
<?php
// 需要使用 ticks
declare(ticks = 1);
// 信号处理函数
function sig_handler($signo)
{
switch ($signo) {
case SIGTERM:
// 处理终止任务
exit;
break;
case 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");
// 或使用对象
// pcntl_signal(SIGUSR1, array($obj, "do_something");
echo "Generating signal SIGUSR1 to self...\n";
// 向当前进程 ID 发送 SIGUSR1 信号
// posix_* 函数需要 posix 扩展
posix_kill(posix_getpid(), SIGUSR1);
echo "Done\n";
?>
pcntl_signal() 不堆叠信号处理程序,而是替换。