diff --git a/lib/Cron/CronHelper.php b/lib/Cron/CronHelper.php index 995f85d311..9cbcf09ee2 100644 --- a/lib/Cron/CronHelper.php +++ b/lib/Cron/CronHelper.php @@ -6,16 +6,29 @@ use MailPoet\Router\Endpoints\CronDaemon as CronDaemonEndpoint; use MailPoet\Router\Router; use MailPoet\Settings\SettingsController; use MailPoet\Util\Security; +use MailPoet\WP\Functions; use MailPoet\WP\Functions as WPFunctions; class CronHelper { const DAEMON_EXECUTION_LIMIT = 20; // seconds - const DAEMON_EXECUTION_TIMEOUT = 35; // seconds const DAEMON_REQUEST_TIMEOUT = 5; // seconds const DAEMON_SETTING = 'cron_daemon'; const DAEMON_STATUS_ACTIVE = 'active'; const DAEMON_STATUS_INACTIVE = 'inactive'; + static function getDaemonExecutionLimit() { + $wp = Functions::get(); + $limit = $wp->applyFilters('mailpoet_cron_get_execution_limit', self::DAEMON_EXECUTION_LIMIT); + return $limit; + } + + static function getDaemonExecutionTimeout() { + $limit = self::getDaemonExecutionLimit(); + $timeout = $limit * 1.75; + $wp = Functions::get(); + return $wp->applyFilters('mailpoet_cron_get_execution_timeout', $timeout); + } + static function createDaemon($token) { $daemon = [ 'token' => $token, @@ -189,7 +202,7 @@ class CronHelper { static function enforceExecutionLimit($timer) { $elapsed_time = microtime(true) - $timer; - if ($elapsed_time >= self::DAEMON_EXECUTION_LIMIT) { + if ($elapsed_time >= self::getDaemonExecutionLimit()) { throw new \Exception(__('Maximum execution time has been reached.', 'mailpoet')); } } diff --git a/lib/Cron/DaemonHttpRunner.php b/lib/Cron/DaemonHttpRunner.php index a0c205fdb2..d2d2f4b460 100644 --- a/lib/Cron/DaemonHttpRunner.php +++ b/lib/Cron/DaemonHttpRunner.php @@ -73,8 +73,8 @@ class DaemonHttpRunner { // if workers took less time to execute than the daemon execution limit, // pause daemon execution to ensure that daemon runs only once every X seconds $elapsed_time = microtime(true) - $this->timer; - if ($elapsed_time < CronHelper::DAEMON_EXECUTION_LIMIT) { - $this->pauseExecution(CronHelper::DAEMON_EXECUTION_LIMIT - $elapsed_time); + if ($elapsed_time < CronHelper::getDaemonExecutionLimit()) { + $this->pauseExecution(CronHelper::getDaemonExecutionLimit() - $elapsed_time); } } // after each execution, re-read daemon data in case it changed diff --git a/lib/Cron/Supervisor.php b/lib/Cron/Supervisor.php index 198a358b34..067680e126 100644 --- a/lib/Cron/Supervisor.php +++ b/lib/Cron/Supervisor.php @@ -13,7 +13,7 @@ class Supervisor { function checkDaemon() { $daemon = $this->daemon; $execution_timeout_exceeded = - (time() - (int)$daemon['updated_at']) >= CronHelper::DAEMON_EXECUTION_TIMEOUT; + (time() - (int)$daemon['updated_at']) >= CronHelper::getDaemonExecutionTimeout(); $daemon_is_inactive = isset($daemon['status']) && $daemon['status'] === CronHelper::DAEMON_STATUS_INACTIVE; if ($execution_timeout_exceeded || $daemon_is_inactive) { diff --git a/tests/integration/Cron/CronHelperTest.php b/tests/integration/Cron/CronHelperTest.php index a303f568e8..c968a20def 100644 --- a/tests/integration/Cron/CronHelperTest.php +++ b/tests/integration/Cron/CronHelperTest.php @@ -31,7 +31,6 @@ class CronHelperTest extends \MailPoetTest { function testItDefinesConstants() { expect(CronHelper::DAEMON_EXECUTION_LIMIT)->equals(20); - expect(CronHelper::DAEMON_EXECUTION_TIMEOUT)->equals(35); expect(CronHelper::DAEMON_REQUEST_TIMEOUT)->equals(5); expect(CronHelper::DAEMON_SETTING)->equals('cron_daemon'); } diff --git a/tests/integration/Cron/SupervisorTest.php b/tests/integration/Cron/SupervisorTest.php index 5172de3d52..9472abba98 100644 --- a/tests/integration/Cron/SupervisorTest.php +++ b/tests/integration/Cron/SupervisorTest.php @@ -52,7 +52,7 @@ class SupervisorTest extends \MailPoetTest { function testRestartsDaemonWhenExecutionDurationIsAboveLimit() { if (getenv('WP_TEST_ENABLE_NETWORK_TESTS') !== 'true') $this->markTestSkipped(); $supervisor = new Supervisor(); - $supervisor->daemon['updated_at'] = time() - CronHelper::DAEMON_EXECUTION_TIMEOUT; + $supervisor->daemon['updated_at'] = time() - CronHelper::getDaemonExecutionTimeout(); $daemon = $supervisor->checkDaemon(); expect(is_int($daemon['updated_at']))->true(); expect($daemon['updated_at'])->notEquals($supervisor->daemon['updated_at']);