PHP多进程编程 > PHP的多进程依赖于**pcntl**扩展,该扩展只能在***nix**系统中使用,并且不能用于web环境中,会产生不可预估的后果。 > pcntl官方文档: https://www.php.net/manual/zh/book.pcntl.php [TOC] ## 快速开始 ```php 0) { var_dump($status); var_dump($res); break; // 跳出死循环 } // 父进程可以先去做别的事情 echo "父进程去{$something[rand(0, 3)]}了".PHP_EOL; sleep(1); } sleep(10); } ``` 执行结果: ![](https://www.hello-world.ren/usr/uploads/2020/08/525467989.png) 由此可见,`pcntl_waitpid()`既解决了子进程资源的回收问题,也可以在等待子进程结束时去做一些其他的事情。 ### 信号 > 信号(signal)是一种软中断,信号机制是进程间通信的一种方式,采用异步通信方式。 信号的产生是有多种方式的,下面是常见的几种: - 用户输入:比如在终端上按下组合键ctrl+C,产生SIGINT信号 - 硬件异常:CPU检测到内存非法访问等异常,通知内核生成相应信号,并发送给发生事件的进程 - 通过系统调用,发送signal信号:kill(),raise(),sigqueue(),alarm(),setitimer(),abort() 进程在收到信号后,可以有如下三种响应: - 直接忽略,不做任何反映。但是`SIGSTOP`和`SIGKILL`两种信号,永远不会被忽略 - 捕捉信号并作出相应的一些反应,具体响应什么可以由用户自己通过程序自定义 - 系统默认响应。大多数进程在遇到信号后,如果用户也没有自定义响应,那么就会采取系统默认响应,大多数的系统默认响应就是终止进程 而使用信号可以更优雅的解决僵尸进程的问题,流程如下: 1. 子进程结束时向父进程发送一个`SIGCHLD`的信号(无须关心) 2. 父进程收到信号后做出相应的动作,即调用`pcntl_waitpid()`回收子进程资源 演示代码: ```php 0) { var_dump($status); var_dump($res); $while = false; // 跳出死循环 } }); switch ($pid) { case -1: // 错误 die('创建进程失败'); break; case 0: // 子进程执行逻辑 echo "child process".PHP_EOL; // 设置进程名 cli_set_process_title('php child process'); // 子进程睡眠10秒 sleep(10); break; default: // 父进程执行逻辑 echo "father process".PHP_EOL; // 设置进程名 cli_set_process_title('php father process'); while ($while) { // 调用等待信号的处理器 pcntl_signal_dispatch(); sleep(1); } sleep(20); } ``` 运行结果: ![](https://www.hello-world.ren/usr/uploads/2020/08/2660683312.png) 2020-08-10 多进程 PHP进阶 展开评论