php进程通信-进程信号(2)

简介: php进程通信-进程信号

二:php基础进程相关函数

注意:(需要pcntl扩展支持)

具体相关函数可查看php手册:http://php.net/manual/zh/book.pcntl.php

1:declare(ticks=1);每执行一条php低级语句,则触发一次register_tick_function函数,并且每执行1条低级语句会检查一次该进程是否有未处理过的信号.,该函数是在php版本小于5.3,用于php进行php信号处理的函数,例如:

<?php

declare(ticks=1);//每执行一条时,触发register_tick_function()注册的函数

$a=1;//再注册之前,不记录

$a=1;//再注册之前,不记录

functiontest(){//定义一个函数

    echo"执行\n";

}

register_tick_function('test');//该条注册函数会被当成低级语句被执行

for($i=0;$i<=3;$i++){//for算一条低级语句

    $i=$i;//赋值算一条

}

在php7.2中,运行结果如下:

image.png


2:pcntl_signal;注册一个信号处理函数,和declare(ticks=1)组合使用:

declare(ticks = 1);

pcntl_signal(SIGINT,function(){

    echo"触发信号Ctrl+c";

});

while(1){

    sleep(1);//死循环运行低级语句

}

当执行该脚本,再ctrl+c的时候,将会捕捉到该信号,并输出,如图:

image.png


3:getmypid.获取当前进程id,posix_kill发送信号

为什么会拿这2个一起说呢?因为posix_kill函数如果需要发送信号,是需要进程id的,而getmypid(),则是获取当前进程id的函数,

以下是将上面的函数组合使用的例子:

<?php

//文件一

declare(ticks = 1);

echogetmypid();//获取当前进程id

pcntl_signal(SIGUSR1,function(){

    echo"触发信号用户自定义信号1";

});

while(1){

    sleep(1);//死循环运行低级语句

}

<?php

//文件二

posix_kill(文件一进程, SIGUSR1);

运行文件1结果:

image.png

运行文件2之后文件1结果:

image.png


4:到这之后,你可能会想到,declare每次运行一次低级语句,都会尝试执行2种结果,效率会不会很差呢?答案是会的,所以在php5.3之后,有了新的函数,那就是pcntl_signal_dispatch

pcntl_signal_dispatch: 调用等待信号的处理器,有了它,将不在需要declare,只需要在循环中增加该函数,就可以调用信号通过了:

<?php

echogetmypid();//获取当前进程id

pcntl_signal(SIGUSR1,function(){

    echo"触发信号用户自定义信号1";

});

while(1){

    pcntl_signal_dispatch();

    sleep(1);//死循环运行低级语句

}

结果和3同样

5:看到4,你可能会觉得,信号处理还是没有那么的智能,能不能不做死循环,就完成异步的信号接收并处理呢?在php7.1之后,有了新的信号处理函数:pcntl_async_signals,返回或设置是否异步信号处理:

<?php

//文件一

echogetmypid();

pcntl_async_signals(true);//设置异步信号

pcntl_signal(SIGUSR1,function(){//安装个user1信号处理函数

    echo"触发信号";

    posix_kill(getmypid(),SIGSTOP);

});

posix_kill(getmypid(),SIGSTOP);//给进程发送暂停信号

<?php

//文件2

posix_kill(文件1进程, SIGCONT);//给进程发送继续信号

posix_kill(文件1进程, SIGUSR1);//给进程发送user1信号

首先文件1运行,再给文件2运行之后,文件1的结果图:

image.png

文件1进程strace 命令截图:

image.png

可看到,进程休眠之后,被9271进程(文件2)唤醒之后并发送了siguse1信号,再然后输出了一段文字,再然后自己给自己发送了进程休眠信号,继续休眠


linux 查看进程命令.可看:

https://blog.csdn.net/liangzhao_jay/article/details/50457197


6:pcntl_alarm和创建一个计时器,在指定的秒数后向进程发送一个SIGALRM信号。每次对 pcntl_alarm()的调用都会取消之前设置的alarm信号。例如:

<?php

 

pcntl_signal(SIGALRM, function() {

    echo'定时到时'. PHP_EOL;

});

 

pcntl_alarm(5);

$i=0;

while(1){

    echo$i.PHP_EOL;$i++;

    pcntl_signal_dispatch();

    sleep(1);

}

image.png


该函数使用场景之一:php熔断

<?php

pcntl_async_signals(true);

pcntl_signal(SIGALRM, function() {

    echo'php处理超时'. PHP_EOL;

});

 

pcntl_alarm(30);

/*

 * 这里是一大段php处理函数

 * */

pcntl_alarm(-1);

先进行30秒的定时,当处理函数超过30秒时,将触发php处理超时函数,从而进行超时逻辑,当在30秒处理完毕时,php将关闭改定时信号,正常往下执行



三:其他

1:php进程信号中,无法捕获SIGKILL信号,该信号将会强制关闭进程


目录
相关文章
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
本文详细介绍了进程间通信(IPC)的六种主要方式:管道、信号、消息队列、共享内存、信号量和套接字。每种方式都有其特点和适用场景,如管道适用于父子进程间的通信,消息队列能传递结构化数据,共享内存提供高速数据交换,信号量用于同步控制,套接字支持跨网络通信。通过对比和分析,帮助读者理解并选择合适的IPC机制,以提高系统性能和可靠性。
1885 14
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
349 16
|
消息中间件 存储 供应链
进程间通信方式-----消息队列通信
【10月更文挑战第29天】消息队列通信是一种强大而灵活的进程间通信机制,它通过异步通信、解耦和缓冲等特性,为分布式系统和多进程应用提供了高效的通信方式。在实际应用中,需要根据具体的需求和场景,合理地选择和使用消息队列,以充分发挥其优势,同时注意其可能带来的复杂性和性能开销等问题。
|
存储 Unix Linux
进程间通信方式-----管道通信
【10月更文挑战第29天】管道通信是一种重要的进程间通信机制,它为进程间的数据传输和同步提供了一种简单有效的方法。通过合理地使用管道通信,可以实现不同进程之间的协作,提高系统的整体性能和效率。
|
PHP Docker 容器
如何在宿主主机运行容器中的php守护进程
在Docker容器中同时运行多个程序(如Nginx+PHP+Ftp)时,需用`docker exec`命令启动额外服务。首先通过`php -v`查看PHP版本,再用`which php-fpm7.4`确认PHP安装路径,通常返回`/usr/sbin/php-fpm7.4`。最后直接运行该路径启动PHP-FPM服务,确保其正常工作。
283 14
|
PHP
PHP的pcntl多进程用法实例
PHP使用PCNTL系列的函数也能做到多进程处理一个事务。
150 12
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
1068 4
|
Linux C语言
C语言 多进程编程(四)定时器信号和子进程退出信号
本文详细介绍了Linux系统中的定时器信号及其相关函数。首先,文章解释了`SIGALRM`信号的作用及应用场景,包括计时器、超时重试和定时任务等。接着介绍了`alarm()`函数,展示了如何设置定时器以及其局限性。随后探讨了`setitimer()`函数,比较了它与`alarm()`的不同之处,包括定时器类型、精度和支持的定时器数量等方面。最后,文章讲解了子进程退出时如何利用`SIGCHLD`信号,提供了示例代码展示如何处理子进程退出信号,避免僵尸进程问题。
gdb中获取进程收到的最近一个信号的信息
gdb中获取进程收到的最近一个信号的信息
Linux源码阅读笔记13-进程通信组件中
Linux源码阅读笔记13-进程通信组件中

热门文章

最新文章