TimeTrex/maint/cron.php

109 lines
6.0 KiB
PHP

<?php /** @noinspection PhpUndefinedVariableInspection */
/*********************************************************************************
*
* TimeTrex is a Workforce Management program developed by
* TimeTrex Software Inc. Copyright (C) 2003 - 2021 TimeTrex Software Inc.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU Affero General Public License version 3 as published by
* the Free Software Foundation with the addition of the following permission
* added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
* WORK IN WHICH THE COPYRIGHT IS OWNED BY TIMETREX, TIMETREX DISCLAIMS THE
* WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
* details.
*
*
* You should have received a copy of the GNU Affero General Public License along
* with this program; if not, see http://www.gnu.org/licenses or write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*
*
* You can contact TimeTrex headquarters at Unit 22 - 2475 Dobbin Rd. Suite
* #292 West Kelowna, BC V4T 2E9, Canada or at email address info@timetrex.com.
*
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
*
* In accordance with Section 7(b) of the GNU Affero General Public License
* version 3, these Appropriate Legal Notices must retain the display of the
* "Powered by TimeTrex" logo. If the display of the logo is not reasonably
* feasible for technical reasons, the Appropriate Legal Notices must display
* the words "Powered by TimeTrex".
*
********************************************************************************/
/*
* Cron replica
* Run this script every minute from the real cron.
*
*/
require_once( dirname( __FILE__ ) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'global.inc.php' );
require_once( dirname( __FILE__ ) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'CLI.inc.php' );
if ( isset( $config_vars['other']['installer_enabled'] ) && $config_vars['other']['installer_enabled'] == true ) {
Debug::text( 'CRON: Installer is enabled, skipping cron jobs for now...', __FILE__, __LINE__, __METHOD__, 0 );
} else if ( isset( $config_vars['other']['down_for_maintenance'] ) && $config_vars['other']['down_for_maintenance'] == true ) {
Debug::text( 'CRON: System is down for maintenance, skipping cron jobs for now...', __FILE__, __LINE__, __METHOD__, 0 );
} else {
if ( isset( $config_vars['path']['php_cli'] ) && $config_vars['path']['php_cli'] != '' ) {
//$current_epoch = strtotime('28-Mar-08 1:30 PM');
$current_epoch = TTDate::getTime();
$executed_jobs = 0;
if ( strpos( $config_vars['database']['host'], ',' ) !== false ) {
$db = $db->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" );
}
?>