php: pcntl_signal信号处理

php: pcntl_signal信号处理

        最近公司需要把老的服务器进行置换迁移,在缩容容器的时候,突然想到项目中,很多常驻进程没有做信号处理,这样会导致容器停止的时候会直接kill进程,导致数据丢失或者逻辑中断的情况,于是使用了pcntl_signal,这里顺便记录下。

PHP5.3.0起支持pcntl_signal系列进程控制函数可以对信号进行安装、分发等操作。

一、信号处理函数

  • pcntl_signal():安装信号;
  • pcntl_signal_dispatch():分发信号;
  • pcntl_sigwaitinfo():等待信号;

二、信号类别

  • SIGTERM:信号触发命令:kill pid、kill -15 pid 、kill -SIGTERM等;
  • SIGINT:程序终止(interrupt)信号,通常由ctrl+c触发;
  • SIGHUP:挂断信号,通常父进程终止后向子进程组发送该信号;
  • SIGALRM:定时器信号;

    更多信号类别,可以点击这里查看。

    注:php不支持信号9和19,也就是SIGKILL、SIGSTOP不支持。

三、demo

<?php
//信号处理器
class Comm_Pcntl{
	public static $exit = false;//是否退出
	//安装信号
	public static function installSignal() {
		pcntl_signal(SIGUSR1, function($signal){
            self::$exit = true;
        });
        pcntl_signal(SIGTERM, function($signal){
            self::$exit = true;
        });
	}
	//分发信号
	public static function dispatchSignal() {
		pcntl_signal_dispatch();
	}
}

测试

<?php
        Comm_Pcntl::installSignal();//安装信号
        while (true) {
            Comm_Pcntl::dispatchSignal();
            if (Comm_Pcntl::$exit) {
                exit("信号退出");
            }
        }

使用上述代码,可以测试kill pid的时候,会输出“信号退出”

                       

点击阅读全文

上一篇 2023年 5月 27日 am11:20
下一篇 2023年 5月 27日 am11:21