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

    }
目录
相关文章
|
1月前
|
Shell 网络安全 数据安全/隐私保护
suuk-s.php.jpg-python 库劫持
suuk-s.php.jpg-python 库劫持
26 0
|
2月前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。
|
3月前
|
存储 安全 Python
[python]使用标准库logging实现多进程安全的日志模块
[python]使用标准库logging实现多进程安全的日志模块
|
4月前
|
安全 API Python
`multiprocessing`是Python的一个标准库,用于支持生成进程,并通过管道和队列、信号量、锁和条件变量等同步原语进行进程间通信(IPC)。
`multiprocessing`是Python的一个标准库,用于支持生成进程,并通过管道和队列、信号量、锁和条件变量等同步原语进行进程间通信(IPC)。
|
5月前
|
运维 JavaScript Serverless
Serverless 应用引擎产品使用合集之php工程已经部署,可以正常访问数据库,静态资源样式无法正常加载,要怎么配置
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
Serverless 应用引擎产品使用合集之php工程已经部署,可以正常访问数据库,静态资源样式无法正常加载,要怎么配置
|
6月前
|
前端开发 Android开发 iOS开发
应用研发平台EMAS使用 aliyun-react-native-push 库接入推送和辅助通道,推送都可以收到,但是在App切到后台或者杀掉进程之后就收不到推送了,是需要配置什么吗?
【2月更文挑战第31天】应用研发平台EMAS使用 aliyun-react-native-push 库接入推送和辅助通道,推送都可以收到,但是在App切到后台或者杀掉进程之后就收不到推送了,是需要配置什么吗?
116 2
|
6月前
|
数据采集 存储 JavaScript
PHP爬虫技术:利用simple_html_dom库分析汽车之家电动车参数
本文旨在介绍如何利用PHP中的simple_html_dom库结合爬虫代理IP技术来高效采集和分析汽车之家网站的电动车参数。通过实际示例和详细说明,读者将了解如何实现数据分析和爬虫技术的结合应用,从而更好地理解和应用相关技术。
PHP爬虫技术:利用simple_html_dom库分析汽车之家电动车参数
|
6月前
|
前端开发 PHP
IIS发布PHP网站常见错误:字体库404
笔者最近在用IIS发布php网站时,前端出现了字体库文件404的错误,关于这个问题,尝试了很多办法,最终发现是字体文件类型不被IIS识别导致的,解决方法是在config文件中添加映射配置,下面我就来详细介绍下。
89 5
|
11月前
|
数据采集 监控 JavaScript
巧用简单工具:PHP使用simple_html_dom库助你轻松爬取JD.com
本文将介绍如何使用PHP语言和一个简单的第三方库simple_html_dom来爬取JD.com的商品信息。simple_html_dom是一个轻量级的HTML解析器,它可以方便地从HTML文档中提取元素和属性,而无需使用正则表达式或DOM操作。本文将通过一个实例来展示如何使用simple_html_dom库来爬取JD.com的商品名称、价格、评分和评论数,并将结果保存到CSV文件中。本文还将介绍如何使用代理IP技术来避免被目标网站封禁或限制。
巧用简单工具:PHP使用simple_html_dom库助你轻松爬取JD.com