您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

php pcntl_fork 进程不死掉怎么办

2025/10/27 15:27:44发布32次查看
php pcntl_fork进程不死掉的解决办法:1、打开相应的php代码文件;2、查看php多线程处理代码;3、通过“public function installsignal(){pcntl_signal(sigterm, [$this, 'sighandle'])...};”方式安装信号处理器即可。
本教程操作环境:windows7系统、php8.1版、dell g3电脑。
php pcntl_fork 进程不死掉怎么办?
问题描述
第一次使用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(); if($pid == -1){ die('进程开启失败'); }else if($pid){ // 父进程得到子进程pid dump('父进程'); dump('父进程得到子进程pid'.$pid); $pids[] = $pid; }else{ dump('子进程'); dump('父进程pid-'.posix_getppid()); // 子进程 dump("第{$i}个进程"); sleep(10); dump("第{$i}个进程:等待10s"); // 发送结束信号 // exit(-1); // posix_kill(getmypid(), sigkill); posix_kill(getmypid(), sighup); } } // 父进程等待子进程执行结束 while($pids){ foreach($pids as $k => $pid_){ dump('父进程不阻塞-等待子进程结束'); $result = pcntl_waitpid($pid_, $status, wnohang); dump($result); if($result === -1){ dump('子进程返回状态'.$status); unset($pids[$k]); } } } /** * 信号处理器 */ public function sighandle($signo) { switch ($signo) { case sigterm: // 处理sigterm信号 dump('处理sigterm信号'); exit; break; case sighup: //处理sighup信号 dump('处理sighup信号'); exit(sighup); break; case sigusr1: dump('处理sigusr1信号'); break; default: // 处理所有其他信号 } } /** * 安装信号处理器 * */ public function installsignal() { pcntl_signal(sigterm, [$this, 'sighandle']); pcntl_signal(sighup, [$this,'sighandle']); pcntl_signal(sigusr1, [$this,'sighandle']); }
推荐学习:《php视频教程》
以上就是php pcntl_fork 进程不死掉怎么办的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product