PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
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 / ActionScheduler / Actions / DaemonRun.php
mailpoet / lib / Cron / ActionScheduler / Actions Last commit date
DaemonRun.php 3 years ago DaemonTrigger.php 7 months ago index.php 3 years ago
DaemonRun.php
128 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\Cron\ActionScheduler\Actions;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Cron\ActionScheduler\ActionScheduler;
9 use MailPoet\Cron\ActionScheduler\RemoteExecutorHandler;
10 use MailPoet\Cron\CronHelper;
11 use MailPoet\Cron\Daemon;
12 use MailPoet\Cron\Triggers\WordPress;
13 use MailPoet\Logging\LoggerFactory;
14 use MailPoet\WP\Functions as WPFunctions;
15
16 class DaemonRun {
17 const NAME = 'mailpoet/cron/daemon-run';
18 const EXECUTION_LIMIT_MARGIN = 10; // 10 seconds
19 const SHORT_DURATION_THRESHOLD = 2; // 2 seconds
20
21 /** @var WPFunctions */
22 private $wp;
23
24 /** @var Daemon */
25 private $daemon;
26
27 /** @var WordPress */
28 private $wordpressTrigger;
29
30 /** @var CronHelper */
31 private $cronHelper;
32
33 /** @var RemoteExecutorHandler */
34 private $remoteExecutorHandler;
35
36 /** @var ActionScheduler */
37 private $actionScheduler;
38
39 /** @var LoggerFactory */
40 private $loggerFactory;
41
42 /**
43 * Default 20 seconds
44 * @var float
45 */
46 private $remainingExecutionLimit = 20;
47
48 /** @var int */
49 private $lastRunDuration = 0;
50
51 public function __construct(
52 WPFunctions $wp,
53 Daemon $daemon,
54 WordPress $wordpressTrigger,
55 CronHelper $cronHelper,
56 RemoteExecutorHandler $remoteExecutorHandler,
57 ActionScheduler $actionScheduler,
58 LoggerFactory $loggerFactory
59 ) {
60 $this->wp = $wp;
61 $this->daemon = $daemon;
62 $this->wordpressTrigger = $wordpressTrigger;
63 $this->cronHelper = $cronHelper;
64 $this->remoteExecutorHandler = $remoteExecutorHandler;
65 $this->actionScheduler = $actionScheduler;
66 $this->loggerFactory = $loggerFactory;
67 }
68
69 public function init(): void {
70 $this->wp->addAction(self::NAME, [$this, 'process']);
71 $this->wp->addFilter('action_scheduler_maximum_execution_time_likely_to_be_exceeded', [$this, 'storeRemainingExecutionLimit'], 10, 5);
72 }
73
74 /**
75 * Run daemon that processes scheduled tasks for limited time
76 */
77 public function process(): void {
78 $this->wp->addAction('action_scheduler_after_process_queue', [$this, 'afterProcess']);
79 $this->wp->addAction('mailpoet_cron_get_execution_limit', [$this, 'getDaemonExecutionLimit']);
80 $this->lastRunDuration = 0;
81 $startTime = time();
82 $this->daemon->run($this->cronHelper->createDaemon($this->cronHelper->createToken()));
83 $this->lastRunDuration = time() - $startTime;
84 }
85
86 /**
87 * Callback for setting the remaining execution time for the cron daemon (MailPoet\Cron\Daemon)
88 */
89 public function getDaemonExecutionLimit(): float {
90 return $this->remainingExecutionLimit;
91 }
92
93 /**
94 * After Action Scheduler finishes its work we need to check if there is more work and in case there is we trigger additional runner.
95 */
96 public function afterProcess(): void {
97 $hasJobsToDo = $this->wordpressTrigger->checkExecutionRequirements();
98 if (!$hasJobsToDo) {
99 return;
100 }
101 // The $lastDurationWasTooShort check prevents scheduling the next immediate action in case the last run was suspiciously short.
102 // If there was still some execution time left, the daemon should have been continued.
103 $lastDurationWasTooShort = ($this->lastRunDuration < self::SHORT_DURATION_THRESHOLD) && ($this->remainingExecutionLimit > 0);
104 if ($lastDurationWasTooShort) {
105 $this->loggerFactory->getLogger(LoggerFactory::TOPIC_CRON)->info('Daemon run ended too early!', [
106 'duration' => $this->lastRunDuration,
107 'remainingLimit' => $this->remainingExecutionLimit,
108 ]);
109 return;
110 }
111 $this->actionScheduler->scheduleImmediateSingleAction(self::NAME);
112 // Chaining async requests can crash MySQL. A brief sleep call in PHP prevents that.
113 // @see https://github.com/woocommerce/action-scheduler/blob/6633378283d33746eec7314586783f58deee5375/classes/ActionScheduler_AsyncRequest_QueueRunner.php#L91-L96
114 sleep(2);
115 $this->remoteExecutorHandler->triggerExecutor();
116 }
117
118 /**
119 * This method is hooked into action_scheduler_maximum_execution_time_likely_to_be_exceeded
120 * It checks how much execution time is left for the daemon to run
121 */
122 public function storeRemainingExecutionLimit($likelyExceeded, $runner, $processedActions, $executionTime, $maxExecutionTime): bool {
123 $newLimit = ($maxExecutionTime - $executionTime) - self::EXECUTION_LIMIT_MARGIN;
124 $this->remainingExecutionLimit = max($newLimit, 0);
125 return (bool)$likelyExceeded;
126 }
127 }
128