(1).学习目标:
了解常见信号类型(百度PHP支持的信号类型),
(2).相关函数学习:
(2.1).pcntl_signal函数用于设置一个信号管理器接收进程信号,参数1:信号类型,参数2:回调函数,用于在接收到参数1类型的信号时执行
(2.2).pcntl_signal_dispatch函数用于调用所有的信号管理器.
延伸:可以设置多个信号管理器,然后让pcntl_signal_dispatch函数批量调用.由于pcntl_signal_dispatch函数内部没有挂起,所以需要我们while(true)执行它
(3).代码案例
(3.1).创建SIGTERM信号监听(当使用kill进程命令时会想进程发送SIGTERM信号)
<?php //安装SIGTERM信号管理 pcntl_signal(SIGTERM, function () { var_dump('好像有人要Kill我,有点慌'); }); //调用等待信号的处理器 while (true) { pcntl_signal_dispatch(); }
解析:通过简单的例子我们知道信号管理可以帮助我们在多进程开发中根据信号类型来响应操作.例如我希望用户kill我时候上报日志等信息。
(3.2).监听Linux的闹钟信号,实现定时器.(pcntl_alarm函数为进程设置闹钟信号,参数是秒)
<?php pcntl_signal(SIGALRM, function () { //设置的闹钟信号只能响应1次.于是我在这里再次设置 pcntl_alarm(5); echo '5秒后我被执行了' . PHP_EOL; //可以编写需要重复执行的代码 }, false); pcntl_alarm(5); while (true) { pcntl_signal_dispatch(); }
解析:由于设置的闹钟信号只能接收1次,于是在接收的地方可以再次设置闹钟,时间循环执行的定时器。第一章有学习非阻塞的多进程,可以配合多进程实现多进程定时任务管理
<?PHP $a=0.5*100; if(is_int($a)){ echo'int'; } else{ echo'not int'; } ...
使用php函数array_multisort()即可实现和SQL一样的order by排序. 例如我们需要对会员表按照主键降序排列,年龄升序排列://会员表数据 $list = []; $list[] = ['mid' =>&n...
重构框架的时候想要考虑支持下cli模式,于是参考了thinkphp的底层。/** * 获取应用根目录 * @return string */ public static function getRootP...
Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者(publisher),订阅者(subscriber)和频道(channel)。 发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个...
主要原理是通过PHP创建多个子进程,在子进程中发送进程闹钟信号,然后再监听闹钟信号中继续发送闹钟信号。同时通过父进程设置非阻塞运行。代码如下:<?php /** * 订单任务 */ class Order { &n...
php7.1引入了PHP异步信号处理函数pcntl_async_signals() 来处理阻塞问题。在php7之前信号处理方式有2种,第一种是基于ticks来每执行一行代码来触发执行信号监听,第二种是直接while(true){ //监听信号 }第一种方式如果某行的代码阻塞时间较长会影响...