您的位置 首页 php

PHP进程信号处理(开发必看)

背景:

项目中会有多个定时任务,常见的方式是用 crontab 起个php进程来处理。

这里会有个问题: 某个特别重要的定时任务执行失败或进程异常退出,怎么捕捉并处理中断异常,通知到运维或开发。

作者曾面试过较多的php开发同学,很多同学未使用过此扩展,这个扩展在某些场景使用,可以让系统更稳定些。

下面介绍下:

主要是使用PHP的pcntl扩展以及posix扩展,这为我们提供了若干操作信号的方法(若想使用这些函数,需要先安装这几个扩展)。

常用的几个函数:

pcntl_signal 安装信号处理器,也就是当指定信号发生时,调用函数。

pcntl_alarm 指定秒数后向进程发送SIGALRM信号。

posix_getpid 返回当前进程id

posix_kill 给指定进程发送信号

一些常用的信号说明:

 SIGHUP
本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时,
通知同一 session 内的各个作业, 这时它们与控制终端不再关联。
 
SIGINT
程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出。
 
SIGQUIT
和SIGINT类似,但由QUIT字符(通常是Ctrl-/)来控制;进程在因收到SIGQUIT退出时会产生core文件,
在这个意义上类似于一个程序错误信号。
 
SIGKILL
用来立即结束程序的运行。本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了,可尝试发送这个信号。
 
SIGTERM
程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,
 shell 命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL。
 
SIGUSR1
留给用户使用
 
SIGUSR2
留给用户使用
 
SIGALRM
时钟定时信号, 计算的是实际的时间或时钟时间。 alarm 函数使用该信号。
 
 SIGCHLD 
子进程结束时, 父进程会收到这个信号。  

下面来看个简单的例子:

 <?php 
function sig_func() {
    echo "killed \r\n";
}
 
//设置信号处理器
pcntl_signal(SIGHUP, 'sig_func');
sleep(100);  

使用php-cli执行此代码:

 [ root @iZuf6cxtv5o2wypkajltntZ ~]# php test.php   

可以看到如下php进程:

 [root@iZuf6cxtv5o2wypkajltntZ ~]# ps -ef | grep test.php
root       54523   54408  0 15:43 pts/0    00:00:00 php test.php  

kill此php进程:

 [root@iZuf6cxtv5o2wypkajltntZ ~]# kill -9 54523  

可以看到代码输出“Killed”,这里可以看到监听到了进程异常的信号,可以在函数中进行业务处理或告警:

 [root@iZuf6cxtv5o2wypkajltntZ ~]# php test.php
Killed  

总结:

php信号处理使用的场景很多,这里只是一个简单的场景,了解了php的信号处理,某些场景可以处理得更好一些。

文章来源:智云一二三科技

文章标题:PHP进程信号处理(开发必看)

文章地址:https://www.zhihuclub.com/80522.shtml

关于作者: 智云科技

热门文章

发表评论

您的电子邮箱地址不会被公开。

网站地图