当前位置: 首页 > 后端技术 > PHP

PHP开发者该知道的多进程消费队列

时间:2023-03-29 18:08:47 PHP

PHP开发者应该知道的多进程消费队列处理的时间太多了...这种方法每次都需要修改crontab。如果进程挂了,就不会及时启动,直到执行下一个crontab才会启动。关闭(重启)进程时使用kill,可能会丢失正在处理的数据。例如,在下面的例子中,我们假设睡眠进程就是处理逻辑。为了看清楚效果,把处理时间放大到10s:平滑退出,处理完正在处理的数据后,再退出SIGTERM=>暴力退出,不管进程是否正在处理数据,直接退出SIGUSR1=>查看进程状态,查看进程占用的内存、运行时间等信息。master进程通过signals和workers进程通信,worker进程安装2个signals,如下:SIGINT=>smoothexitSIGUSR1=>检查worker进程自身状态为什么worker进程只安装2个信号,而且有一个少了SIGTERM,因为master进程收到SIGTERM信号后,向worker进程发送SIGKILL信号,默认强制进程关闭。worker进程被master进程fork出来,这样master进程可以通过pcntl_wait等待子进程退出事件,并在子进程退出时返回子进程pid,做处理并启动新进程补充它。master进程也通过pcntl_wait等待接收信号。当信号到达时,它将返回-1。这个地方还是有一些坑的,下面会详细说明。在PHP中有两种触发信号的方法。第一种方式是declare(ticks=1);,效率不高。每次Zend执行低级语句时,它都会检查进程中是否有未处理的信号。现在已经很少用了,PHP5.3.0及更早的版本可能会用到这个。第二种是使用pcntl_signal_dispatch调用未处理的信号。适用于PHP5.4.0及以后版本。可以巧妙地将这个函数放在循环中,性能上基本没有损失。现在建议申请。PHP安装和修复信号量PHP通过pcntl_signal安装信号,函数声明如下:boolpcntl_signal(int$signo,[callback$handler[,bool$restart_syscalls=true])第三个参数restart_syscalls不太好理解,我找了很多资料不是很清楚。经过实验,发现这个参数对pcntl_wait函数接收到的信号有影响。当设置为默认值true时,发送信号,进程用pcntl_wait接收不到。它必须设置为假。请参阅此示例: