1000 $to_do_real_fee = 0; //uid黑名单 $black_uids = DB::table('temp_pay_black_users')->pluck('uid')->all(); DB::table('temp_pay_users')->where('charge_balance','>=',$user_min_left_fee)->whereNotIn('uid',$black_uids)->orderBy('done_num','asc')->chunk(1,function ($users) use ($bids,$day_user_max_fee,$day_user_min_fee,$day_max_fee,&$to_do_real_fee){ foreach ($users as $user) { if($to_do_real_fee >= $day_max_fee) { dd('reach day max fee: '.$to_do_real_fee); } $read_record_info = Redis::hgetall('book_read:' . $user->uid); $last_record = isset($read_record_info['last_read']) ? explode('_',$read_record_info['last_read']) : null; $latest_read_at = $last_record ? $last_record[2] : 0; //判断最近一个月是否有阅读 有则continue 无阅读记录可能存储有误 刷过的用户不限制 if(!$latest_read_at || (time() - $latest_read_at < 4*30*86400 && $user->done_num==0)) continue; shuffle($bids);//打乱bids顺序 $read_bids = [];//阅读过的bid列表 todo foreach ($read_record_info as $k=>$_re) { is_numeric($k) && $read_bids[] = $k; } //查用户阅读记录里的图书是否有哪本书在书单内 //如果有之前阅读中的图书则继续阅读 foreach ($read_bids as $k=>$_bid) { $is_read_to_last = false; //判断是否订阅完毕 todo if(in_array($_bid,$bids) && !$is_read_to_last) { unset($read_bids[$k]); array_unshift($bids,$_bid); } } //实际刷的bid顺序为$bids $to_do_date = date('Y-m-d',time()+86400); $to_do_fee = min(mt_rand($day_user_min_fee,$day_user_max_fee),$user->charge_balance);//不超过总充值余额 $latest_read_at = date('Y-m-d H:i:s',$latest_read_at); $bids = implode(',',$bids); $up_data = compact('bids','latest_read_at','to_do_date','to_do_fee'); dump($up_data); if(DB::table('temp_pay_users')->where('id',$user->id)->update($up_data)) { $to_do_real_fee += $to_do_fee; } } }); Log::info("======查付费用户情况 【任务执行结束】=====" . date("y-m-d H:i:s" . "\n")); print_r("======查付费用户情况 【任务执行结束】=====" . date("y-m-d H:i:s" . "\n")); } }