From b716a3965ce851d8f1b3e5b157c5e30b6c354bed Mon Sep 17 00:00:00 2001 From: Molkobain Date: Fri, 16 Feb 2024 17:14:53 +0100 Subject: [PATCH] =?UTF-8?q?N=C2=B07008=20-=20Fix=20missing=20background=20?= =?UTF-8?q?tasks=20in=20CRON=20when=20autoloaded=20and=20NOT=20in=20"devel?= =?UTF-8?q?oper=5Fmode"=20(#578)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webservices/cron.php | 106 +++++++++++++++++++------------------------ 1 file changed, 46 insertions(+), 60 deletions(-) diff --git a/webservices/cron.php b/webservices/cron.php index 7c0b98014..b27f80912 100644 --- a/webservices/cron.php +++ b/webservices/cron.php @@ -44,12 +44,6 @@ if (!file_exists($sConfigFile)) require_once(APPROOT.'/application/startup.inc.php'); -// Temporary fix until below bug is resolved properly: -// N°7008 - Fix missing background tasks in CRON when NOT in "developer_mode" -require_once(APPROOT.'/sources/SessionTracker/SessionGC.php'); -require_once(APPROOT.'/sources/Service/TemporaryObjects/TemporaryObjectGC.php'); -require_once(APPROOT.'/sources/Service/Notification/Event/EventiTopNotificationGC.php'); - $oCtx = new ContextTag(ContextTag::TAG_CRON); function ReadMandatoryParam($oP, $sParam, $sSanitizationFilter = 'parameter') @@ -414,71 +408,63 @@ function ReSyncProcesses($oP, $bVerbose, $bDebug) $oNow = new DateTime(); $aProcesses = array(); - foreach (get_declared_classes() as $sTaskClass) + foreach (utils::GetClassesForInterface('iProcess', '', ['[\\\\/]lib[\\\\/]', '[\\\\/]node_modules[\\\\/]', '[\\\\/]test[\\\\/]', '[\\\\/]tests[\\\\/]']) as $sTaskClass) { - $oRefClass = new ReflectionClass($sTaskClass); - if ($oRefClass->isAbstract()) - { - continue; - } - if ($oRefClass->implementsInterface('iProcess')) - { - $oProcess = new $sTaskClass; - $aProcesses[$sTaskClass] = $oProcess; + $oProcess = new $sTaskClass; + $aProcesses[$sTaskClass] = $oProcess; - // Create missing entry if needed - if (!array_key_exists($sTaskClass, $aTasks)) + // Create missing entry if needed + if (!array_key_exists($sTaskClass, $aTasks)) + { + // New entry, let's create a new BackgroundTask record, and plan the first execution + $oTask = new BackgroundTask(); + $oTask->SetDebug($bDebug); + $oTask->Set('class_name', $sTaskClass); + $oTask->Set('total_exec_count', 0); + $oTask->Set('min_run_duration', 99999.999); + $oTask->Set('max_run_duration', 0); + $oTask->Set('average_run_duration', 0); + $oRefClass = new ReflectionClass($sTaskClass); + if ($oRefClass->implementsInterface('iScheduledProcess')) { - // New entry, let's create a new BackgroundTask record, and plan the first execution - $oTask = new BackgroundTask(); - $oTask->SetDebug($bDebug); - $oTask->Set('class_name', $sTaskClass); - $oTask->Set('total_exec_count', 0); - $oTask->Set('min_run_duration', 99999.999); - $oTask->Set('max_run_duration', 0); - $oTask->Set('average_run_duration', 0); + $oNextOcc = $oProcess->GetNextOccurrence(); + $oTask->Set('next_run_date', $oNextOcc->format('Y-m-d H:i:s')); + } + else + { + // Background processes do start asap, i.e. "now" + $oTask->Set('next_run_date', $oNow->format('Y-m-d H:i:s')); + } + if ($bVerbose) + { + $oP->p('Creating record for: '.$sTaskClass); + $oP->p('First execution planned at: '.$oTask->Get('next_run_date')); + } + $oTask->DBInsert(); + } + else + { + /** @var \BackgroundTask $oTask */ + $oTask = $aTasks[$sTaskClass]; + if ($oTask->Get('next_run_date') == '3000-01-01 00:00:00') + { + // check for rescheduled tasks $oRefClass = new ReflectionClass($sTaskClass); if ($oRefClass->implementsInterface('iScheduledProcess')) { $oNextOcc = $oProcess->GetNextOccurrence(); $oTask->Set('next_run_date', $oNextOcc->format('Y-m-d H:i:s')); - } - else - { - // Background processes do start asap, i.e. "now" - $oTask->Set('next_run_date', $oNow->format('Y-m-d H:i:s')); - } - if ($bVerbose) - { - $oP->p('Creating record for: '.$sTaskClass); - $oP->p('First execution planned at: '.$oTask->Get('next_run_date')); - } - $oTask->DBInsert(); - } - else - { - /** @var \BackgroundTask $oTask */ - $oTask = $aTasks[$sTaskClass]; - if ($oTask->Get('next_run_date') == '3000-01-01 00:00:00') - { - // check for rescheduled tasks - $oRefClass = new ReflectionClass($sTaskClass); - if ($oRefClass->implementsInterface('iScheduledProcess')) - { - $oNextOcc = $oProcess->GetNextOccurrence(); - $oTask->Set('next_run_date', $oNextOcc->format('Y-m-d H:i:s')); - $oTask->DBUpdate(); - } - } - // Reactivate task if necessary - if ($oTask->Get('status') == 'removed') - { - $oTask->Set('status', 'active'); $oTask->DBUpdate(); } - // task having a real class to execute - unset($aTasks[$sTaskClass]); } + // Reactivate task if necessary + if ($oTask->Get('status') == 'removed') + { + $oTask->Set('status', 'active'); + $oTask->DBUpdate(); + } + // task having a real class to execute + unset($aTasks[$sTaskClass]); } }