transientCache = $transientCache; $this->segmentsRepository = $segmentsRepository; $this->segmentSubscribersRepository = $segmentSubscribersRepository; } public function processTaskStrategy(ScheduledTask $task, $timer) { $segments = $this->segmentsRepository->findAll(); foreach ($segments as $segment) { $this->recalculateSegmentCache($timer, (int)$segment->getId(), $segment); } // update cache for subscribers without segment $this->recalculateSegmentCache($timer, 0); return true; } private function recalculateSegmentCache($timer, int $segmentId, ?SegmentEntity $segment = null): void { $this->cronHelper->enforceExecutionLimit($timer); $now = Carbon::now(); $item = $this->transientCache->getItem(TransientCache::SUBSCRIBERS_STATISTICS_COUNT_KEY, $segmentId); if ($item === null || !isset($item['created_at']) || $now->diffInMinutes($item['created_at']) > self::EXPIRATION_IN_MINUTES) { $this->transientCache->invalidateItem(TransientCache::SUBSCRIBERS_STATISTICS_COUNT_KEY, $segmentId); if ($segment) { $this->segmentSubscribersRepository->getSubscribersStatisticsCount($segment); } else { $this->segmentSubscribersRepository->getSubscribersWithoutSegmentStatisticsCount(); } } } public function getNextRunDate() { return Carbon::createFromTimestamp($this->wp->currentTime('timestamp')); } public function shouldBeScheduled(): bool { $now = Carbon::now(); $oldestCreatedAt = $this->transientCache->getOldestCreatedAt(TransientCache::SUBSCRIBERS_STATISTICS_COUNT_KEY); return $oldestCreatedAt === null || $now->diffInMinutes($oldestCreatedAt) > self::EXPIRATION_IN_MINUTES; } }