当前位置:首页 > PHP > 正文内容

【二】PHP多进程学习-进程信号管理

高老师7年前 (2019-04-04)PHP1566

(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次,于是在接收的地方可以再次设置闹钟,时间循环执行的定时器。第一章有学习非阻塞的多进程,可以配合多进程实现多进程定时任务管理

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/84.html

分享给朋友:

“【二】PHP多进程学习-进程信号管理” 的相关文章

抛弃salt,使用password_hash()加密

抛弃salt,使用password_hash()加密

md5/sha1+salt方式是目前各大cms常用的加密方式,虽然salt安全,但是各大md5网站也在研究这个方向,那么我们应该选择password_hash动态hash来助力,一种密码有多种hash结果.看代码模拟登陆.<?php //01.注册 $user ='zhang...

cookie跨域,cookie p3p跨域

cookie跨域,cookie p3p跨域

最近在公司开发一个新的项目假设项目域名是a.com,需要接入b.com的单点登陆系统。(1).首先我们会在a.com的登陆页面用iframe引入b.com来显示登陆界面,实际上登陆验证操作都是在b.com上面(2).当b.com验证通过,会在前端ajax请求a.com的回调地址,这个回调地址目的就是...

php守护进程

php守护进程

<?php /**  * daemonize让当前脚本为守护进程执行  * @param string $callback 匿名函数  */ function daemonize($callback) {...

swoole中的worker_num和task_worker_num

swoole中的worker_num和task_worker_num

(1)swoole启动的主进程是master进程负责全局管理,然后master进程会再fork一个manager进程。(2)manager进程开始统一管理进程创建回收管理。(3)manager进程根据设置的worker_num和task_worker_num来创建work进程和task进程因此启动s...

 php命令行中文乱码,php cli中文乱码

php命令行中文乱码,php cli中文乱码

<?php //如果支持exec函数,可以使用的方式 exec('chcp 65001'); //如果exec函数因安全问题禁用,可以使用的方式 pclose(popen('chcp 65001', 'r'));...

php redis队列实现秒杀 , php用redis 实现秒杀功能

php redis队列实现秒杀 , php用redis 实现秒杀功能

为什么使用队列?因为pop取队列具有原子性。假如我们需要秒杀一个商品id,我们先将商品的库存保存到一个队列。例如:<?php $redis = new Redis(); $redis->connect('127.0.0.1', 6...