PHP pcntl_signal 进程控制函数



  • 定义和用法

    pcntl_signal - 安装一个信号处理器
  • 版本支持

    PHP4 PHP5 PHP7
    支持 支持 支持
    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() 语句在程序中指定允许发生回调的位置。
  • 语法

    pcntl_signal( int $signo , callback $handler [, bool $restart_syscalls = true ] )
    
    pcntl_signal() 为signo指定的信号安装一个新 的信号处理器。
  • 参数

    参数 必需的 描述
    signo 信号编号。
    handler 信号处理器可以是用户创建的函数或方法的名字,也可以是系统常量 SIG_IGN(译注:忽略信号处理程序)或SIG_DFL(默认信号处理程序).
    注意当你使用一个对象方法的时候,该对象的引用计数回增加使得它在你改变为其他处理或脚本结束之前是持久存在的。
    restart_syscalls 指定当信号到达时系统调用重启是否可用。(译注:经查资料,此参数意为系统调用被信号打断时,系统调用是否从 开始处重新开始,但根据http://bugs.php.net/bug.php?id=52121,此参数存在bug无效。)
  • 返回值

    成功时返回 TRUE, 或者在失败时返回 FALSE。
  • 示例

    下面例子演示多进程示例:
    //使用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 "Done\n";
    
  • 相关页面

    pcntl_fork() - 在当前进程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号,而子进程得到的是0。
    pcntl_waitpid() - 等待或返回fork的子进程状态