beginUid = $beginUid; $this->endUid = $endUid; $this->idStr = $idStr; $this->idRedisKey = $idRedisKey; $this->requestId = $requestId; } public $tries = 1; public $timeout = 3600; /** * 获取任务时,应该通过的中间件。 * * @return array */ public function middleware() { return [new WithoutOverlapping($this->idRedisKey)]; } /** * Execute the job. * * @return void */ public function handle() { $beginTimestamp = time(); $logPrefix = sprintf( "[CLEANUP_CLI_UPDATE_SEEDING_LEECHING_TIME_HANDLE_JOB], commonRequestId: %s, beginUid: %s, endUid: %s, idStr: %s, idRedisKey: %s", $this->requestId, $this->beginUid, $this->endUid, $this->idStr, $this->idRedisKey, ); do_log("$logPrefix, job start ..."); $idStr = $this->idStr; $delIdRedisKey = false; if (empty($idStr) && !empty($this->idRedisKey)) { $delIdRedisKey = true; $idStr = NexusDB::cache_get($this->idRedisKey); } if (empty($idStr)) { do_log("$logPrefix, no idStr or idRedisKey", "error"); return; } //批量取,简单化 // $res = sql_query("select userid, sum(seedtime) as seedtime_sum, sum(leechtime) as leechtime_sum from snatched group by userid where userid in ($idStr)"); $res = NexusDB::table("snatched") ->selectRaw("userid, sum(seedtime) as seedtime_sum, sum(leechtime) as leechtime_sum") ->whereRaw("userid in ($idStr)") ->groupBy("userid") ->get(); $seedtimeUpdates = $leechTimeUpdates = []; $nowStr = now()->toDateTimeString(); $count = 0; foreach ($res as $row) { $count++; $seedtimeUpdates[] = sprintf("when %d then %d", $row->userid, $row->seedtime_sum ?? 0); $leechTimeUpdates[] = sprintf("when %d then %d", $row->userid, $row->leechtime_sum ?? 0); } $sql = sprintf( "update users set seedtime = case id %s end, leechtime = case id %s end, seed_time_updated_at = '%s' where id in (%s)", implode(" ", $seedtimeUpdates), implode(" ", $leechTimeUpdates), $nowStr, $idStr ); $result = NexusDB::statement($sql); if ($delIdRedisKey) { NexusDB::cache_del($this->idRedisKey); } $costTime = time() - $beginTimestamp; do_log(sprintf( "$logPrefix, [DONE], update user count: %s, result: %s, cost time: %s seconds", $count, var_export($result, true), $costTime )); do_log("$logPrefix, sql: $sql", "debug"); } /** * Handle a job failure. * * @param \Throwable $exception * @return void */ public function failed(\Throwable $exception) { do_log("failed: " . $exception->getMessage() . $exception->getTraceAsString(), 'error'); } }