<?php
//在程序需要分叉的时候,使用pcntl_fork()产生子进程,然后多线程同时执行任务
$pid = pcntl_fork();
if($pdi < 0)
exit('fork error!');
if($pid) {
//如果pid大于0,那么是父进程,
//这边让父进程直接个客户端返回数据,达到事实的效果
# dothing
}else {
//子进程,让子进程进行复杂的业务逻辑。
//让其睡眠100s
sleep(100);
}
/*
上面的这种方式,已经可以实现多线程同时处理,但是,子进程一直在跑,那么
1,进程一直存在,linux系统会被其消耗致死
2,客户端页面一直处于刷新页面,客户体验差
*/
//解决问题:
//子进程执行代码逻辑后,直接将其die() 或者 exit() 退出,那么可以释放其占用的资源。
//但是产生了问题,产生n多defunct(僵尸进程)
//那么如何消除僵尸进程呢
//1,父类里面使用pcntl_wait(),让其等待子进程结束,将其回收。
//2,在页面开始时定义,让系统自动回收僵尸进程(注:子进程结束后,必须die掉或者exit或者 exec('kill -9 ' . posix_getpid()))
pcntl_signal(SIGCLD, SIG_IGN);
pcntl_signal(SIGCHLD,SIG_IGN);