• 技术文章 >后端开发 >php教程

    PHP的Pcntl多进程扩展的用法介绍

    不言不言2019-02-25 10:08:17转载1132
    本篇文章给大家带来的内容是关于PHP的Pcntl多进程扩展的用法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

    PHP提供了一个Pcntl扩展,Pcntl基于Linux的进程,Windows系统暂时没有这个扩展,用于实现基础的多进程实现,可以利用这个处理一个很耗时的任务,例如发订阅邮件,短信,站内信等。

    示例代码:

    代码是基于Laravel 框架的,建议使用此框架来允许这部分代码。

    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(
    
                            'lastid' => $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);
            }
        }

    更多建议读文档,进程和线程,还有很多内容的,需要读书去学习了

    以上就是PHP的Pcntl多进程扩展的用法介绍的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:segmentfault,如有侵犯,请联系admin@php.cn删除
    专题推荐:php
    上一篇:php中small内存规格的计算(代码示例) 下一篇:如何从PHP中的字符串中删除换行符?(代码示例)
    大前端线上培训班

    相关文章推荐

    • PHP使用pcntl_fork实现多进程下载图片的方法_php技巧• php pcntl_fork和pcntl_fork 的用法_php技巧• PHP的pcntl多进程用法实例_PHP• PHP使用pcntl_fork实现多进程下载图片的方法,

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网