getConnection( 'write' ); //Force connection to master/write database, so status_id can't get out-of-sync and cause duplicate jobs to run at the same time. } $cjlf = new CronJobListFactory(); $job_arr = $cjlf->getArrayByListFactory( $cjlf->getAll() ); if ( is_array( $job_arr ) ) { $total_jobs = count( $job_arr ); foreach ( $job_arr as $job_id => $job_name ) { //Get each cronjob row again individually incase the status has changed, since we wait for execution to occur in some cases and these can be relatively long running. $cjlf = new CronJobListFactory(); $cjlf->getById( $job_id ); //Let Execute determine if job is running or not so it can find orphans. -- This should also *not* be cached in case the same job is run multiple times due to a invalid cached status_id. if ( $cjlf->getRecordCount() > 0 ) { foreach ( $cjlf as $cjf_obj ) { //Debug::text('Checking if Job ID: '. $job_id .' is scheduled to run...', __FILE__, __LINE__, __METHOD__, 0); if ( $cjf_obj->isScheduledToRun( $current_epoch ) == true ) { $executed_jobs++; $cjf_obj->Execute( $config_vars['path']['php_cli'], dirname( __FILE__ ) ); } } } } } else { $total_jobs = 0; } //Make sure a QueueWorker is launched each time this is executed. // **EVEN IF JOB QUEUE IS DISABLED, AS THERE COULD BE LATENT JOBS STILL IN THE QUEUE THAT NEED TO BE PROCESSED IF THE JOB QUEUE WAS DISABLED** // Regardless if there are any jobs executed, since the QueueWorker might be used for real-time jobs trigger by the UI. $bp = new BackgroundProcess(); $command = '"' . $config_vars['path']['php_cli'] . '" "'. dirname( __FILE__ ) . DIRECTORY_SEPARATOR .'QueueWorker.php"'; //Make sure we use full path, otherwise the file might not be found on Windows especially. $bp->BackgroundExec( Misc::getEnvironmentVariableConfigFile() . $command ); //Skips all max process checks and just launch the queue worker immediately in the background. unset( $bp, $command ); echo "NOTE: Jobs are scheduled to run at specific times each day, therefore it is normal for only some jobs to be queued each time this file is run.\n"; echo "Jobs Queued For Running: $executed_jobs of $total_jobs\n"; Debug::text( 'CRON: Jobs Queued For Running: ' . $executed_jobs . ' of ' . $total_jobs, __FILE__, __LINE__, __METHOD__, 0 ); } else { echo "ERROR: timetrex.ini.php does not define 'php_cli' option in the [path] section. Unable to run maintenance jobs!\n"; Debug::text( 'PHP_CLI not defined in timetrex.ini.php file.', __FILE__, __LINE__, __METHOD__, 0 ); } //Save file to log directory with the last executed date, so we know if the CRON daemon is actually calling us. $file_name = $config_vars['path']['log'] . DIRECTORY_SEPARATOR . 'timetrex_cron_last_executed.log'; @file_put_contents( $file_name, TTDate::getDate( 'DATE+TIME', time() ) . "\n" ); } ?>