thinkphp使用chunk笔记!
2021-09-25 本文已影响0人
DragonersLi
chunk数据分批处理:
处理大量数据库记录,可以考虑使用chunk方法,该方法一次获取结果集的一小块,然后填充每一小块数据到要处理的闭包,节省内存,直至处理全部完毕,返回结果。
批量更新数据库用户表,更新为会员。每次取100条,结果赋值给$res,循环数据处理,直至数据库表中所有符合where条件的处理完毕!用浏览器执行代码会存在超时问题502 Bad Gateway
tp5使用命令行chunk递归查询用户无限上级
<?php
namespace app\admin\command;
use think\console\{Input,Output,Command};
use think\console\Input\{Option,Argument};
use app\common\model\{User,UserUpper};
class Up extends Command
{
//定义任务名和描述
protected function configure(){
$this->setName('up')->setDescription("php think up 用户上级关系"); //选项定义
}
//调用该类时,会自动运行execute方法
protected function execute(Input $input, Output $output)
{
$time = time();
try{
User::where("1=1")
->field("id,mobile,upper,is_member")
->chunk(10, function($users) use($output,$time){
foreach ($users as $user) {
$pid = '';
if($user['id']){
$pid = self::digui($user['id']);
if(is_array($pid)){
$pid = implode(',',$pid);
$pid = ','.$pid.',';
}
}
$insert[] = [
'uid'=>$user['id'],
'pid'=>$pid,
'create_time'=>$time,
];
}
if(UserUpper::insertAll($insert)){
$output->writeln(" sync ok");
}else{
dlog('up','失败:'.$insert);
}
},$field = 'id',$sort = 'asc');
}catch (\Exception $e){
$output->writeln($e->getMessage().';第'.$e->getLine());
}
}
/**
* 递归返回用户所有上级数组
* @param int $id
* @param array $result
* @return array
*/
protected static function digui($id = 0,&$result =[]){
$pid = User::where(['id'=>$id])->value('upper');
if($pid && $id !=$pid){
$result[] = $pid;
self::digui($pid,$result);
return $result;
}
}
}
如果查询的数据表主键不是id
,则需要指定字段$field
,排序字段$sort
[think\db\exception\PDOException] SQLSTATE[42S22]: Column not found: 1054 Unknown column 'id' in 'order clause'