`
乱蓬头199303
  • 浏览: 80525 次
文章分类
社区版块
存档分类
最新评论

[PHP] 使用 pcntl 库实现PHP多进程

阅读更多
摘要: 最近因项目需要,需要大量同步数据,数据量基数在3000万条左右,因此想到了开启多进程来处理,下面是处理的完整代码,基于laravel 5.1框架。 这是经过实际环境验证过的,所以类似场景可以简单修改下就可使用。

最近因项目需要,需要大量同步数据,数据量基数在3000万条左右,因此想到了开启多进程来处理,下面是处理的完整代码,基于laravel 5.1框架。
这是经过实际环境验证过的,所以类似场景可以简单修改下就可使用。

    /**
     * ******数据同步脚本
     *
     * @author yedonghai
     */
    namespace App\Console\Commands;

    use DB;
    use Illuminate\Console\Command;
    use App\Services\ZzcService;

    class ZzcSyncCommand extends Command
    {
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'zzcsync:data';

        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'sync zzc apply info';

        /**
         * Execute the console command.
         *
         * @return mixed
         */
        public function handle()
        {
            $userNum = 6500000;
            $workers = 30;
            $block = 50000;
            $loop = 0;
            $flag = 0;

            $processIds = [];
            do {

                $flag = $loop * $workers * $block;

                for ($i = 0; $i < $workers; $i++) {
                    $minUserId = ($block * $i) + $flag;
                    $maxUserId = $block * ($i + 1) + $flag;

                    if ($minUserId < $userNum) {
                        $processIds[$i] = pcntl_fork();
                        switch ($processIds[$i]) {
                            case -1 :
                                echo "fork failed : {$i} \r\n";
                                exit;
                            case 0 :
                                $this->_userReport($minUserId, $maxUserId);
                                exit;
                            default :
                                break;
                        }
                    } else {
                        break;
                    }
                }

                while(count($processIds) > 0) {
                    $mypid = pcntl_waitpid(-1, $status, WNOHANG);
                    foreach ($processIds as $key => $pid) {
                        if ($mypid == $pid || $mypid == -1) {
                            unset($processIds[$key]);
                        }
                    }
                }

                $loop++;

            } while (empty($processIds) && $flag < $userNum);
        }

        /**
         * 子进程获取指定数据
         *
         * @param integer  $minUserId  读取区间的下限
         * @param integer  $maxUserId  读取区间的上限
         *
         * @return array
         */
        private function _userReport($minUserId, $maxUserId)
        {
            $users = DB::table('users')->leftJoin('user_credits', 'user_credits.user_id', '=', 'users.id')
                ->select('users.id', 'users.user_name as mobile', 'users.id_number as pid', 'users.truename as name')
                ->where('user_credits.audit_limit', '>', 0)
                ->where('users.id', '>=', $minUserId)
                ->where('users.id', '<', $maxUserId)
                ->get();

            foreach ($users as $userObj) {

                $userExist = DB::table('zzc_apply')->where('user_id', $userObj->id)->first();
                if (!empty((array)$userExist)) {
                    continue;
                }

                $userArr = [];

                $userArr['loan_type'] = '消费贷';
                $userArr['loan_term'] = '3';
                $userArr['loan_purpose'] = '购物';
                $userArr['applicant']['name']   = $userObj->name;
                $userArr['applicant']['pid']    = $userObj->pid;
                $userArr['applicant']['mobile'] = $userObj->mobile;

                $user = json_encode($userArr);
                $zzcService = new ZzcService();
                $zzcService->createNezha($user);
            }
        }

    }
原文链接http://click.aliyun.com/m/23104/
分享到:
评论

相关推荐

    PHP使用pcntl_fork实现多进程下载图片的方法

    主要介绍了PHP使用pcntl_fork实现多进程下载图片的方法,较为详细的分析了pcntl_fork的原理与用法,以及使用pcntl_fork实现多进程下载图片的方法,非常具有实用价值,需要的朋友可以参考下

    PHP的pcntl多进程用法实例

    PHP是广泛用于网络开发的服务器端脚本语言,而...通过这个实例,我们可以了解到PHP多进程编程的基本原理和实现方式。实际应用中,多进程编程可以根据任务的特点和需求,灵活调整进程数量、分配策略和进程间通信机制。

    分享PHP-pcntl 实现多进程代码

    尽管php本身是一种主要用于web开发的语言,但它同样可以在CLI(命令行接口)模式下执行,这时就可以使用pcntl扩展来实现多进程编程。 首先,要使用pcntl扩展,必须确保在编译php的时候已经添加了pcntl扩展的支持。...

    利用PCNTL实现PHP代码异步和并行运行

    在`spatie/async`库中,你可以通过创建`Process`对象来启动一个新的子进程,并使用`Pool`类来管理多个进程。`Pool`允许你并行运行一组任务,每个任务都可以是任何可调用的对象,如匿名函数、类方法或者预定义的函数...

    PHP实现多线程多进程

    ### PHP 实现多线程与多进程 #### 知识点概述 在 PHP 中实现多线程或多进程是一项挑战性的任务,因为 PHP 本质上是一种单线程语言,并且主要用于 Web 开发,通常运行在共享内存环境中。然而,在某些场景下,如后台...

    PHP-多进程编程示例代码

    在PHP中,可以借助`pcntl`(Process Control)扩展来实现多进程编程。`pcntl`扩展提供了诸如创建子进程、进程间通信、信号处理等功能,使得PHP具备了进行复杂并发任务的能力。 标题"PHP-多进程编程示例代码"涉及到...

    基于PCNTL的PHP并发处理封装类

    在PHP编程中,有时我们需要处理大量并发任务,这时可以利用多进程(Multi-Process)技术来提高程序的执行效率。PCNTL(Process Control Extension)是PHP的一个扩展,提供了与Unix/Linux系统调用接口类似的函数,...

    php swoole 多进程发送邮件

    标题“php swoole 多进程发送邮件”所涉及的知识点主要涵盖PHP编程、Swoole扩展的使用以及多进程并发执行。 1. PHP与Swoole: PHP是一种广泛使用的服务器端脚本语言,主要用于Web开发,而Swoole则是一个为PHP设计...

    PHP多进程之pcntl_fork的实例详解

    本文将详细介绍pcntl_fork的使用方法和实例,帮助读者更好地理解和掌握PHP多进程编程。 首先,了解什么是进程。在操作系统中,进程是程序执行时的实例,每个进程都有自己独立的内存空间、执行状态和执行顺序。进程...

    php 的多进程操作实践案例分析

    在PHP多进程操作中,使用`pcntl_wait()` 或 `pcntl_waitpid()` 来防止僵尸进程的产生。 #### 7. 实际案例分析 本文通过多个示例对PHP多进程操作进行了详细的案例分析。 - 例1展示了基本的父进程和子进程的创建与...

    PHP的一个面向对象的多进程管理器

    PHP实现多进程主要依赖于`pcntl`(Process Control)扩展。这个扩展提供了一系列函数,如`pcntl_fork()`用于创建子进程,`pcntl_wait()`和`pcntl_waitpid()`用于等待子进程结束,以及`pcntl_signal()`用于处理信号。...

    一个纯PHP实现的多进程,定时任务管理工具,兼容部分crontab语法, 支持守护进程

    cronManager可能使用了如RabbitMQ、Redis或PHP内置的PCNTL库来实现这一功能,这取决于具体实现。消息队列的使用也意味着任务的执行顺序和并发度可以根据需求进行灵活调整。 cronManager的API设计简洁明了,使得...

    以实例全面讲解PHP中多进程编程的相关函数的使用

    总结起来,PHP的多进程编程主要是通过PCNTL库实现的,它提供了一系列的函数来创建、管理子进程,处理信号以及控制进程间的通信。在编写这类程序时,需要注意子进程的正确管理和资源回收,以确保程序的稳定性和效率。...

    EasyTask简单易用的PHP常驻内存多进程任务管理器.zip

    EasyTask的多进程功能是通过PCNTL(Process Control)扩展实现的,这个扩展允许PHP程序创建、管理和控制子进程。在EasyTask中,你可以设置多个子进程同时处理任务,这些子进程之间可以独立工作,互不影响,提高了...

    multiprocess可轻松让普通PHP脚本变守护进程和多进程执行

    用户可能需要解压这个文件,然后在PHP项目中引入和使用这个库,以便实现多进程功能。 在实际应用中,使用`multiprocess`库创建多进程时,开发者需要注意进程间的同步和通信问题,因为多个进程各自独立,可能会导致...

    PHP多进程简单实例小结

    本文将深入探讨PHP多进程的原理、实现方法以及在使用过程中的注意事项。 首先,PHP多进程的核心在于`pcntl`模块,它是PHP的一个扩展,提供了进程控制的功能。在编译PHP时,需要通过`--enable-pcntl`选项开启这个...

Global site tag (gtag.js) - Google Analytics