摘要: 最近因项目需要,需要大量同步数据,数据量基数在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实现多进程下载图片的方法,较为详细的分析了pcntl_fork的原理与用法,以及使用pcntl_fork实现多进程下载图片的方法,非常具有实用价值,需要的朋友可以参考下
PHP是广泛用于网络开发的服务器端脚本语言,而...通过这个实例,我们可以了解到PHP多进程编程的基本原理和实现方式。实际应用中,多进程编程可以根据任务的特点和需求,灵活调整进程数量、分配策略和进程间通信机制。
尽管php本身是一种主要用于web开发的语言,但它同样可以在CLI(命令行接口)模式下执行,这时就可以使用pcntl扩展来实现多进程编程。 首先,要使用pcntl扩展,必须确保在编译php的时候已经添加了pcntl扩展的支持。...
在`spatie/async`库中,你可以通过创建`Process`对象来启动一个新的子进程,并使用`Pool`类来管理多个进程。`Pool`允许你并行运行一组任务,每个任务都可以是任何可调用的对象,如匿名函数、类方法或者预定义的函数...
### PHP 实现多线程与多进程 #### 知识点概述 在 PHP 中实现多线程或多进程是一项挑战性的任务,因为 PHP 本质上是一种单线程语言,并且主要用于 Web 开发,通常运行在共享内存环境中。然而,在某些场景下,如后台...
在PHP中,可以借助`pcntl`(Process Control)扩展来实现多进程编程。`pcntl`扩展提供了诸如创建子进程、进程间通信、信号处理等功能,使得PHP具备了进行复杂并发任务的能力。 标题"PHP-多进程编程示例代码"涉及到...
在PHP编程中,有时我们需要处理大量并发任务,这时可以利用多进程(Multi-Process)技术来提高程序的执行效率。PCNTL(Process Control Extension)是PHP的一个扩展,提供了与Unix/Linux系统调用接口类似的函数,...
标题“php swoole 多进程发送邮件”所涉及的知识点主要涵盖PHP编程、Swoole扩展的使用以及多进程并发执行。 1. PHP与Swoole: PHP是一种广泛使用的服务器端脚本语言,主要用于Web开发,而Swoole则是一个为PHP设计...
本文将详细介绍pcntl_fork的使用方法和实例,帮助读者更好地理解和掌握PHP多进程编程。 首先,了解什么是进程。在操作系统中,进程是程序执行时的实例,每个进程都有自己独立的内存空间、执行状态和执行顺序。进程...
在PHP多进程操作中,使用`pcntl_wait()` 或 `pcntl_waitpid()` 来防止僵尸进程的产生。 #### 7. 实际案例分析 本文通过多个示例对PHP多进程操作进行了详细的案例分析。 - 例1展示了基本的父进程和子进程的创建与...
PHP实现多进程主要依赖于`pcntl`(Process Control)扩展。这个扩展提供了一系列函数,如`pcntl_fork()`用于创建子进程,`pcntl_wait()`和`pcntl_waitpid()`用于等待子进程结束,以及`pcntl_signal()`用于处理信号。...
cronManager可能使用了如RabbitMQ、Redis或PHP内置的PCNTL库来实现这一功能,这取决于具体实现。消息队列的使用也意味着任务的执行顺序和并发度可以根据需求进行灵活调整。 cronManager的API设计简洁明了,使得...
总结起来,PHP的多进程编程主要是通过PCNTL库实现的,它提供了一系列的函数来创建、管理子进程,处理信号以及控制进程间的通信。在编写这类程序时,需要注意子进程的正确管理和资源回收,以确保程序的稳定性和效率。...
EasyTask的多进程功能是通过PCNTL(Process Control)扩展实现的,这个扩展允许PHP程序创建、管理和控制子进程。在EasyTask中,你可以设置多个子进程同时处理任务,这些子进程之间可以独立工作,互不影响,提高了...
用户可能需要解压这个文件,然后在PHP项目中引入和使用这个库,以便实现多进程功能。 在实际应用中,使用`multiprocess`库创建多进程时,开发者需要注意进程间的同步和通信问题,因为多个进程各自独立,可能会导致...
本文将深入探讨PHP多进程的原理、实现方法以及在使用过程中的注意事项。 首先,PHP多进程的核心在于`pcntl`模块,它是PHP的一个扩展,提供了进程控制的功能。在编译PHP时,需要通过`--enable-pcntl`选项开启这个...