Lösung, um das Absterben des PHP-Prozesses pcntl_fork zu verhindern: 1. Öffnen Sie die entsprechende PHP-Codedatei. 2. Sehen Sie sich den PHP-Multithread-Verarbeitungscode an. 3. Übergeben Sie „public function installSignal(){pcntl_signal(SIGTERM, [$this, 'sigHandle '])...};"-Methode zum Installieren des Signalprozessors.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, PHP-Version 8.1, Dell G3-Computer.
php pcntl_fork Was soll ich tun, wenn der Prozess nicht abstürzt?
Problembeschreibung
Als ich PHP-Multithreading zum ersten Mal zur Verarbeitung von Aufgaben verwendete, wurde das Problem mit dem Zombie-Prozess verursacht. Der Grund dafür war, dass der untergeordnete Prozess kein Endsignal sendete und der übergeordnete Prozess nicht darauf wartete Das Ende des untergeordneten Prozesses Der untergeordnete Prozess pid
fork. Nachdem der untergeordnete Prozesscode ausgeführt wurde, muss er exit() und ein Endsignal senden. Andernfalls fahren Sie mit der Verzweigung des untergeordneten Prozesses fort. Holen Sie sich den übergeordneten Prozess pid = posix_getppid(), aktuelle pid = getmypid() oder posix_getpid()
Der übergeordnete Prozess wartet am besten, bis der untergeordnete Prozess die Ausführung abgeschlossen hat, und recycelt den untergeordneten Prozess, um ein synchrones und asynchrones Warten zu erreichen der übergeordnete Prozess durch pcntl_wait() und pcntl_waitpid() Schleifenunterprozess:
$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']); }
Das obige ist der detaillierte Inhalt vonWas soll ich tun, wenn der PHP-Prozess pcntl_fork nicht abstürzt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!