Heim  >  Artikel  >  Backend-Entwicklung  >  Was soll ich tun, wenn der PHP-Prozess pcntl_fork nicht abstürzt?

Was soll ich tun, wenn der PHP-Prozess pcntl_fork nicht abstürzt?

藏色散人
藏色散人Original
2022-10-25 09:14:541337Durchsuche

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.

Was soll ich tun, wenn der PHP-Prozess pcntl_fork nicht abstürzt?

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时代表子进程结束

  • Die Funktion des Signalprozessors besteht darin, das vom Verarbeitungsunterprozess zurückgegebene Endsignal zu verarbeiten
  • 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(&#39;进程开启失败&#39;);
                }else if($pid){
                    // 父进程得到子进程pid
                    dump(&#39;父进程&#39;);
                    dump(&#39;父进程得到子进程pid&#39;.$pid);
                    $pids[] = $pid;
                }else{
                    dump(&#39;子进程&#39;);
                    dump(&#39;父进程pid-&#39;.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(&#39;父进程不阻塞-等待子进程结束&#39;);
                    $result = pcntl_waitpid($pid_, $status, WNOHANG);
                    dump($result);
                    if($result === -1){
                  dump(&#39;子进程返回状态&#39;.$status);
           unset($pids[$k]);
                    }
            }
        }
        /**
         * 信号处理器
         */
        public function sigHandle($signo)
        {
            switch ($signo) {
                case SIGTERM:
                    // 处理SIGTERM信号
                    dump(&#39;处理SIGTERM信号&#39;);
                    exit;
                    break;
                case SIGHUP:
                        //处理SIGHUP信号
                    dump(&#39;处理SIGHUP信号&#39;);
                    exit(SIGHUP);
                    break;
                case SIGUSR1:
                    dump(&#39;处理SIGUSR1信号&#39;);
                    break;
                default:
                    // 处理所有其他信号
            }
        }
        /**
         * 安装信号处理器
         *
         */
        public function installSignal()
        {
            pcntl_signal(SIGTERM, [$this, &#39;sigHandle&#39;]);
            pcntl_signal(SIGHUP, [$this,&#39;sigHandle&#39;]);
            pcntl_signal(SIGUSR1, [$this,&#39;sigHandle&#39;]);
        }
  • Empfohlenes Lernen: „
PHP-Video-Tutorial

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn