问题
第一次使用php多线程处理任务引起僵尸进程问题,原因是子进程没有发送结束信号,父进程没有等待子进程的结束
参考资料
理解
- pcntl_fork 返回-1:开启进程失败 0:表示当前是子进程 大于零:当前是父进程,返回值是子进程pid
- fork的子进程代码执行完后必须exit(),发送结束信号。否则继续fork子进程。获取父进程pid = posix_getppid(), 当前pid = getmypid()或者posix_getpid()
- 父进程最好等待子进程执行结束回收子进程通过pcntl_wait()、pcntl_waitpid()实现同步、异步等待父进程循环子进程:
$result = pcntl_waitpid($pid_, $status, WNOHANG);
$result等于-1时代表子进程结束
- 信号处理器的作用是根据处理子进程返回的结束信号进行处理
public function run()
{
$this->installSignal();
// 获取当前pid getmypid()
$current_pid = posix_getpid();
// dump('当前pid:'.$current_pid);
cli_set_process_title('设置process_title');
$pids = [];
for($i = 0; $i < $this->forks; $i ++){
$pid = pcntl_fork(