Heim >Backend-Entwicklung >PHP-Tutorial >Einführung in die Verwendung der Pcntl-Multiprozesserweiterung von PHP

Einführung in die Verwendung der Pcntl-Multiprozesserweiterung von PHP

不言
不言nach vorne
2019-02-25 10:08:172831Durchsuche

Dieser Artikel bietet Ihnen eine Einführung in die Verwendung der Pcntl-Mehrprozesserweiterung. Ich hoffe, dass er für Freunde hilfreich ist.

PHP bietet eine Pcntl-Erweiterung, die auf dem Linux-Prozess basiert. Sie wird zur Implementierung einer grundlegenden Multiprozess-Implementierung verwendet zeitaufwändige Aufgabe, wie das Versenden von Abonnement-E-Mails, Textnachrichten, Website-Nachrichten usw.

Beispielcode:

Der Code basiert auf dem Laravel-Framework. Es wird empfohlen, dieses Framework zu verwenden, um diesen Teil des Codes zu ermöglichen.

public function index(Request $request)

    {

        pcntl_signal(SIGCHLD, SIG_IGN); //如果父进程不关心子进程什么时候结束,子进程结束后,内核会回收。  

        $max = 8000;

        $workers = 10;

        

        $pids = array();

        for($i = 0; $i < $workers; $i++){

            $pids[$i] = pcntl_fork();

            $pid = posix_getpid();

            switch ($pids[$i]) {

                case -1:

                    echo "fork error : {$i} \r\n";

                    exit;

                case 0:

                    $param = array(

                        &#39;lastid&#39; => $max / $workers * $i,

                        'maxid' => $max / $workers * ($i+1),

                    );

                    $this->doSomething($pid, $param);

                    exit;

                default:

                    break;

            }

        }

        

        foreach ($pids as $i => $pid) {

            if($pid) {

                //父进程会得到子进程号,所以这里是父进程执行的逻辑  

                //如果不需要阻塞进程,而又想得到子进程的退出状态,则可以注释掉pcntl_wait($status)语句,或写成:  

                pcntl_wait($status,WNOHANG); //等待子进程中断,防止子进程成为僵尸进程。

                //pcntl_waitpid($pid, $status);

            }

        }

    }



// 可以看到那个子进程在处理哪些数据

    public function doSomething($filename, $param)

    {

        for ($i = $param['lastid']; $i < $param['maxid']; $i++) {

            $path = "./test/";

            if (!is_dir($path)){

                mkdir($path, 0777, true);

            }
            $content = $i . '|';
            $file = $path . $filename . ".txt";
            file_put_contents($file, $content, FILE_APPEND);
        }
    }

Weitere Vorschläge sind das Lesen von Dokumenten, Prozessen und Threads. Es gibt viele Inhalte, die Sie lesen und lernen müssen

Das obige ist der detaillierte Inhalt vonEinführung in die Verwendung der Pcntl-Multiprozesserweiterung von PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen