PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.35.0
MailPoet – Newsletters, Email Marketing, and Automation v5.35.0
5.36.0 5.35.1 5.35.0 5.34.3 5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / lib / Cron / Workers / SubscribersCountCacheRecalculation.php
mailpoet / lib / Cron / Workers Last commit date
Automations 1 year ago KeyCheck 2 years ago SendingQueue 1 month ago StatsNotifications 3 months ago AuthorizedSendingEmailsCheck.php 3 years ago BackfillEngagementData.php 2 years ago Bounce.php 1 month ago BounceTaskSubscribersCleanup.php 1 month ago BulkConfirmationEmailResend.php 3 months ago ExportFilesCleanup.php 3 months ago InactiveSubscribersMaintenance.php 1 month ago LogCleanup.php 11 months ago Mixpanel.php 10 months ago NewsletterTemplateThumbnails.php 2 years ago ReEngagementEmailsScheduler.php 2 years ago Scheduler.php 3 months ago SendingQueueBodyCleanup.php 3 months ago SendingTaskSubscribersCleanup.php 3 months ago SimpleWorker.php 2 years ago StatisticsExport.php 3 months ago SubscriberLimitNotificationWorker.php 3 months ago SubscriberLinkTokens.php 2 years ago SubscribersCountCacheRecalculation.php 1 month ago SubscribersEngagementScore.php 2 weeks ago SubscribersLastEngagement.php 3 months ago SubscribersSegmentsCountSync.php 1 month ago SubscribersStatsReport.php 2 years ago Tracks.php 10 months ago UnconfirmedSubscribersCleanup.php 3 months ago UnsubscribeTokens.php 1 month ago WooCommercePastOrders.php 2 years ago WooCommerceSync.php 3 years ago WorkersFactory.php 1 month ago index.php 3 years ago
SubscribersCountCacheRecalculation.php
107 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\Cron\Workers;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Cache\TransientCache;
9 use MailPoet\Entities\ScheduledTaskEntity;
10 use MailPoet\Entities\SegmentEntity;
11 use MailPoet\Segments\SegmentsRepository;
12 use MailPoet\Subscribers\SubscribersCountsController;
13 use MailPoetVendor\Carbon\Carbon;
14
15 class SubscribersCountCacheRecalculation extends SimpleWorker {
16 private const EXPIRATION_IN_MINUTES = 30;
17 const TASK_TYPE = 'subscribers_count_cache_recalculation';
18 const AUTOMATIC_SCHEDULING = false;
19 const SUPPORT_MULTIPLE_INSTANCES = false;
20
21 /** @var TransientCache */
22 private $transientCache;
23
24 /** @var SegmentsRepository */
25 private $segmentsRepository;
26
27 /** @var SubscribersCountsController */
28 private $subscribersCountsController;
29
30 public function __construct(
31 TransientCache $transientCache,
32 SegmentsRepository $segmentsRepository,
33 SubscribersCountsController $subscribersCountsController
34 ) {
35 parent::__construct();
36 $this->transientCache = $transientCache;
37 $this->segmentsRepository = $segmentsRepository;
38 $this->subscribersCountsController = $subscribersCountsController;
39 }
40
41 public function processTaskStrategy(ScheduledTaskEntity $task, $timer) {
42 $segments = $this->segmentsRepository->findAll();
43 foreach ($segments as $segment) {
44 $this->recalculateSegmentCache($timer, (int)$segment->getId(), $segment);
45 }
46
47 // update cache for subscribers without segment
48 $this->recalculateSegmentCache($timer, 0);
49
50 $this->recalculateGlobalCache($timer);
51
52 $this->recalculateHomepageCache($timer);
53
54 // remove redundancies from cache
55 $this->cronHelper->enforceExecutionLimit($timer);
56 $this->subscribersCountsController->removeRedundancyFromStatisticsCache();
57
58 return true;
59 }
60
61 private function recalculateSegmentCache($timer, int $segmentId, ?SegmentEntity $segment = null): void {
62 $this->cronHelper->enforceExecutionLimit($timer);
63 $now = Carbon::now();
64 $item = $this->transientCache->getItem(TransientCache::SUBSCRIBERS_STATISTICS_COUNT_KEY, $segmentId);
65 if ($item === null || !isset($item['created_at']) || $now->diffInMinutes($item['created_at']) > self::EXPIRATION_IN_MINUTES) {
66 if ($segment) {
67 $this->subscribersCountsController->recalculateSegmentStatisticsCache($segment);
68 } else {
69 $this->subscribersCountsController->recalculateSubscribersWithoutSegmentStatisticsCache();
70 }
71 }
72 }
73
74 private function recalculateGlobalCache($timer): void {
75 $this->cronHelper->enforceExecutionLimit($timer);
76 $now = Carbon::now();
77 $item = $this->transientCache->getItem(TransientCache::SUBSCRIBERS_GLOBAL_STATISTICS_COUNT_KEY, 0);
78 if ($item === null || !isset($item['created_at']) || $now->diffInMinutes($item['created_at']) > self::EXPIRATION_IN_MINUTES) {
79 $this->subscribersCountsController->recalculateGlobalStatusStatisticsCache();
80 }
81 }
82
83 private function recalculateHomepageCache($timer): void {
84 $this->cronHelper->enforceExecutionLimit($timer);
85 $now = Carbon::now();
86 $item = $this->transientCache->getItem(TransientCache::SUBSCRIBERS_HOMEPAGE_STATISTICS_COUNT_KEY, 0);
87 if ($item === null || !isset($item['created_at']) || $now->diffInMinutes($item['created_at']) > self::EXPIRATION_IN_MINUTES) {
88 $this->cronHelper->enforceExecutionLimit($timer);
89 $this->subscribersCountsController->recalculateHomepageStatisticsCache();
90 }
91 }
92
93 public function getNextRunDate() {
94 return Carbon::now()->millisecond(0);
95 }
96
97 public function shouldBeScheduled(): bool {
98 $scheduledOrRunningTask = $this->scheduledTasksRepository->findScheduledOrRunningTask(self::TASK_TYPE);
99 if ($scheduledOrRunningTask) {
100 return false;
101 }
102 $now = Carbon::now();
103 $oldestCreatedAt = $this->transientCache->getOldestCreatedAt(TransientCache::SUBSCRIBERS_STATISTICS_COUNT_KEY);
104 return $oldestCreatedAt === null || $now->diffInMinutes($oldestCreatedAt) > self::EXPIRATION_IN_MINUTES;
105 }
106 }
107