资讯专栏INFORMATION COLUMN

PHP的Pcntl多进程扩展基础使用

AprilJ / 2290人阅读

摘要:提供了一个扩展,基于的进程,系统暂时没有这个扩展,用于实现基础的多进程实现,可以利用这个处理一个很耗时的任务,例如发订阅邮件,短信,站内信等。如果父进程不关心子进程什么时候结束子进程结束后,内核会回收。

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

参考链接:

http://php.net/manual/zh/ref....

http://php.net/manual/zh/ref....

http://blog.csdn.net/huyanpin...

http://rango.swoole.com/archi...

https://www.lvtao.net/dev/php...

示例代码:

代码是基于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} 
";

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

        }

    }

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30165.html

相关文章

  • PHP进程系列笔记(五)

    摘要:消息队列更常见的用途是主进程分配任务,子进程消费执行。子进程前面加了个,这是为了防止父进程还未往消息队列中加入内容直接退出。 前面几节都是讲解pcntl扩展实现的多进程程序。本节给大家介绍swoole扩展的swoole_process模块。 swoole多进程 swoole_process 是swoole提供的进程管理模块,用来替代PHP的pcntl扩展。 首先,确保安装的swoole...

    qianfeng 评论0 收藏0
  • 基于PCNTl扩展PHP进程管理库

    摘要:子进程得到的为所以这里是子进程执行的逻辑。最后再次附上项目地址欢迎 大多数人都说php是单进程执行的,其实这是不准确的,在cli模式下php是可以做到多进程的;不过需要pcntl的扩展; $pid = pcntl_fork(); //父进程和子进程都会执行下面代码 if ($pid == -1) { //错误处理:创建子进程失败时返回-1. die(could not...

    王岩威 评论0 收藏0
  • PHP进程编程

    摘要:输出结果子进程回收阻塞方式刚刚有么一般我习惯用加上命令来查找运行着的后台进程。还有一种方法,既可以回收已经结束的子进程,又可以并行。但是这个时候,子进程会被交给号进程,号进程成为了这些子进程的继父。 使用多进程的优点: 1. 使用多进程, 子进程结束以后, 内核会负责回收资源 2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程. ...

    lieeps 评论0 收藏0
  • multi-process-pcntl 基于PCNTLPHP并发处理 封装类

    摘要:职场多年下来,技术也算是逐渐地有些积累,但是更重要的是对自身有了更加合理的人生定位。或许,人生的意义,就在于此处的感悟吧。基于的并发处理封装类。对语言底层扩展的的深度解读和生产应用。函数官网手册中对的说明,更细化的需求可以研究深化。 个人声明 作者:于立(wx/yulichenr) 敬告:联系我,请注明来源和来意 本人开发有很多年了,但是很少整理分享,如今趁着清闲就为大家服务了,希...

    awokezhou 评论0 收藏0
  • PHP进程系列笔记(一)

    摘要:用于创建子进程。该函数阻塞当前进程,只到当前进程的一个子进程退出或者收到一个结束当前进程的信号。注意处需要注意子进程需要防止子进程也进入循环。如果没有,最终创建的子进程不只个。 本系列文章将向大家讲解pcntl_*系列函数,从而更深入的理解进程相关知识。 PCNTL在PHP中进程控制支持默认是关闭的。您需要使用 --enable-pcntl 配置选项重新编译PHP的 CGI或CLI版本...

    ddongjian0000 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<