PHP的pcntl_signal_dispatch和posix_kill、pcntl_signal配合发送信号

2023-12-07 22:48

本文主要是介绍PHP的pcntl_signal_dispatch和posix_kill、pcntl_signal配合发送信号,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先看下以下代码:

//注册SIGINT和SIGUSR2信号的响应
pcntl_signal(SIGINT, 'signalHandler', false);  //SIGINT : 2
pcntl_signal(SIGUSR2, 'signalHandler', false); //SIGINT : 12function signalHandler($signal)
{echo "收到了信号:" . $signal;if ($signal == SIGUSR2) {echo "进行业务操作1" . PHP_EOL;} elseif ($signal == SIGINT) {echo "进行业务操作2" . PHP_EOL;}// 其他的else if逻辑...
}while (true) {sleep(1);//调用该方法,信号处理函数才会被执行pcntl_signal_dispatch();
}

先解释下上面的代码的含义:

//官方手册解释如下:
bool  pcntl_signal( int $signo, callback $handler[, bool $restart_syscalls = true] )
函数pcntl_signal()为signo指定的信号安装一个新的信号处理器。 返回一个布尔值

首先pcntl_signal()函数,他是注册某一个信号与处理该信号的一个回调函数。那么信号是什么呢,也就是linux命令中:kill 命令后面的那个数字。可以用下面的方法查看所有信号:

root@ubuntu-virtual-machine:/var/www/html/test# kill -l1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

我们常用的kill -9 杀死某个进程,其中这个9指的就是SIGKILL 。

所以上面的这段代码:

pcntl_signal(SIGINT, 'signalHandler', false); //SIGINT : 2

含义就是,当你输入的是SIGINT(也就是kill 2)时,他将使用回调函数"signalHandler( )",来处理逻辑。

而其中的while循环:

while (true) {sleep(1);//调用该方法,信号处理函数才会被执行pcntl_signal_dispatch();
}

其中的sleep(1),是为了减轻CPU的压力,毕竟该循环是一个死循环。而函数 pcntl_signal_dispatch();说明如下:

          bool pcntl_signal_dispatch ( void )

         函数pcntl_signal_dispatch()调用每个等待信号通过pcntl_signal() 安装的处理器。

其实就是调用上面写的那个回调方法“signalHandler()”,在调用该方法的同时,将从命令行输入的那个kill后面的那个数字当做参数传递到这个回调方法中(或者将posix_kill()方法中的信号,当做参数传递到这个方法中去),然后开始执行那个回调方法中的逻辑 。比如下面的这个代码块儿,就是传递的posix_kill()中的信号:

echo "安装信号处理器...\n";
pcntl_signal(SIGHUP, function ($signo) {echo "信号处理器被调用\n";
});echo "为自己生成SIGHUP信号...\n";
posix_kill(posix_getpid(), SIGHUP);//posix_getpid()函数是获取当前进程号echo "分发...\n";
pcntl_signal_dispatch();echo "完成\n";

参考:https://blog.csdn.net/weixin_42075590/article/details/80740968

这篇关于PHP的pcntl_signal_dispatch和posix_kill、pcntl_signal配合发送信号的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/467628

相关文章

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

SpringBoot AspectJ切面配合自定义注解实现权限校验的示例详解

《SpringBootAspectJ切面配合自定义注解实现权限校验的示例详解》本文章介绍了如何通过创建自定义的权限校验注解,配合AspectJ切面拦截注解实现权限校验,本文结合实例代码给大家介绍的非... 目录1. 创建权限校验注解2. 创建ASPectJ切面拦截注解校验权限3. 用法示例A. 参考文章本文

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁