第一步: 需要在方法前加上
set_time_limit(0);
// ini_set('max_execution_time', 0);
fastcgi_finish_request(); // 冲刷(flush)所有响应的数据给客户端,关闭连接(需要运行在FastCGI模式,windows下无效)
ignore_user_abort(true); //在关闭连接后,继续运行php脚本
该方法一经开启将持续进行,直至操作完成 第二步: 查询每个账户的可操作次数
//先查询出可操作账户与可操作次数
$list = DB::table('oe_ad_account_info')
->where('type', 2)
->get([
'advertiser_id',
'times'
])->toArray();
第三步 根据上一步查询出来的可操作账户 来查询当天已执行成功的操作次数 将需要执行的操作次数减去已执行成功的操作次数 执行操作
foreach ($list as $key => &$item) {
//查询当天已操作的计划与次数
$already = DB::table('oe_ad_account_operation')
->where("msg", "true")
->whereDate('created_at', '>=', date('Y-m-d 00:00:00', time()))
->whereDate('created_at', '<=', date('Y-m-d 23:59:59', time()))
->where('advertiser_id', $key)
->count("id");
//减去已有操作
$item->times -= $already;
file_put_contents("log/" . date("Y-m-d") . "-log.txt", date("Y-m-d H:i:s") . " 账户id:$key 剩余操作次数:{$item->times}\n", FILE_APPEND);
//判断剩余操作次数
if ($item->times <= 0) {
continue;
}
//将当前次数进行取偶数
if ($item->times % 2 == 1) {
$item->times += 1;
}
// 拉取广告计划 这里是需要进行操作的计划
$tmpPlan = $this->getAccountPlan();
//遍历广告计划
foreach ($tmpPlan as $planItem) {
// 总次数为0
if ($item->times <= 0) {
break;
}
$planItem->advertiser_id = $key;
//查询当前计划剩余的次数
$operation = DB::table('oe_ad_account_operation')
->where('plan_id', $planItem->ad_id)
->where("msg", 'true')
->whereBetween("created_at", [date("Y-m-d 00:00:00"), date("Y-m-d 23:59:59")])
->count("id");
//计数器 这里设置每条计划操作不能超过20次
$counter = 20 - $operation;
//将当前次数进行取偶数
if ($counter % 2 == 1) {
$counter -= 1;
}
//计数器归零
if ($counter <= 0) {
continue;
}
//判断剩余次数和当前设计
if ($item->times > $counter) {
$item->times -= $counter;
} else {
$counter = $item->times;
$item->times = 0;
}
for ($i = 0; $i < $counter;) {
//修改预算
$id1 = $this->action($planItem, $i, "修改");
//还原预算
$id = $this->action($planItem, $i, "还原");
}
}
|