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

PHP多进程系列笔记(二)

时间:2023-03-29 22:02:23 PHP

上一篇讲解了pcntl_fork和pcntl_wait这两个函数的使用。本文继续讲解PHP多进程相关的新知识。僵尸(zombie)进程这里说的是僵尸进程:僵尸进程是指父进程已经退出,进程死掉后,没有进程接受它,就变成了僵尸进程(zombie)进程。任何进程在退出前(使用exit退出),都会变成僵尸进程(用来保存进程状态等信息),然后由init进程接管。僵尸进程如果不及时回收,就会在系统中占据一个进程表项。如果这样的僵尸进程太多,系统最终会没有可用的进程表项,其他程序就无法运行了。使用以下命令查看是否存在僵尸进程。如果是,它类似于以下内容:$ps-A-ostat,ppid,pid,cmd|grep-e'^[Zz]'Z+282283[php]如果sub进程还没有结束,父进程就结束了,那么init进程会自动接管子进程并回收。如果父进程是一个循环,并且没有安装SIGCHLD信号处理函数,则调用wait或waitpid()等待子进程结束。那么子进程结束后,如果没有回收,就会产生僵尸进程。示例:fork_zombie.php出现僵尸进程。此时即使手动终止脚本程序,也无法关闭僵尸子进程。需要用kill-9来关机。pcntl_signalboolpcntl_signal(int$signo,callback$handler[,bool$restart_syscalls=true])此函数为signo指定的信号安装一个新的信号处理程序。安装SIGCHLD信号上一节我们讲了僵尸进程的原因:如果父进程是一个循环,没有安装SIGCHLD信号处理函数,调用wait或者waitpid()等待子进程结尾。那么子进程结束后,如果没有回收,就会产生僵尸进程。本节我们通过安装SIGCHLD信号处理函数来解决僵尸进程问题。例子: