Process::signal

设置异步信号监听。

bool Process::signal(int $signo, callable $callback);
  • 此方法基于signalfdeventloop是异步IO,不能用于同步程序中
  • 同步阻塞的程序可以使用pcntl扩展提供的pcntl_signal
  • $callback如果为null,表示移除信号监听
  • 如果已设置了此信号的回调函数,重新设置时会覆盖历史设置

Server中不能设置某些信号监听,如SIGTERMSIGALAM

使用实例

Process::signal(SIGTERM, function($signo) {
     echo "shutdown.";
});

进程退出

4.4版本中不再将信号监听作为EventLoop退出的block条件。因此在程序中如果只有信号监听的事件,进程会直接退出。

Process::signal(SIGTERM, function($signo) {
     echo "shutdown.";
});
Swoole\Event::wait();

上述程序不会进入EventLoopSwoole\Event::wait()将立即返回,并退出进程。



  • youke

    这个方法只能在异步的tcp client上用吗?我在同步的client上使用这个方法,可是不管用,kill时没有监听到SIGTERM信号。

    $cli = new swoole_client(SWOOLE_TCP | SWOOLE_KEEP, SWOOLE_SOCK_SYNC);

    swoole_process::signal(SIGTERM, function($signo) { echo "shutdown."; });

    if ($cli->connect('127.0.0.1', 9501)) { while (true) { // do something } } else { echo "connect failed."; }

  • Rango-韩天峰

    异步和同步的代码不能混用。

  • 中华8字节

    那个server中addProcess怎么关掉?

  • 晨东

    问下,process中,如果父进程意外退出,子进程,怎么监控到?并退出呢。

  • play_soso

    https://wiki.swoole.com/wiki/page/p-process.html

  • 李尔摩斯

    感觉比PHP的Pcntl写起来好用

  • 我们都是坏银

    PHP7 Pcntl 在TCP Client上表现不好, 同是信号监听的signal 方法 swoole_process::signal 表现更好

  • byte

    同步阻塞的程序可以使用pcntl扩展提供的pcntl_signal

    可以提供具体例子不,我使用了,但无效