Maison  >  Article  >  développement back-end  >  Introduction à l'utilisation de l'extension multi-processus Pcntl de PHP

Introduction à l'utilisation de l'extension multi-processus Pcntl de PHP

不言
不言avant
2019-02-25 10:08:172764parcourir

Cet article vous présente une introduction à l'utilisation de l'extension multi-processus Pcntl de PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

PHP fournit une extension Pcntl. Pcntl est basé sur le processus Linux. Les systèmes Windows n'ont pas cette extension pour le moment. Elle est utilisée pour implémenter une implémentation multi-processus de base. tâche chronophage, comme l'envoi d'e-mails d'abonnement, de SMS, de messages de site, etc.

Exemple de code :

Le code est basé sur le framework Laravel. Il est recommandé d'utiliser ce framework pour autoriser cette partie du code.

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);
        }
    }

Plus de suggestions sont de lire des documents, des processus et des fils de discussion, il y a beaucoup de contenu, vous devez lire et apprendre

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer