diff options
Diffstat (limited to 'phpBB/includes/cron.php')
-rw-r--r-- | phpBB/includes/cron.php | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/phpBB/includes/cron.php b/phpBB/includes/cron.php new file mode 100644 index 0000000000..2aa22858b7 --- /dev/null +++ b/phpBB/includes/cron.php @@ -0,0 +1,135 @@ +<?php +/** +* +* @package phpBB3 +* @version $Id$ +* @copyright (c) 2010 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +/** +* @ignore +*/ +if (!defined('IN_PHPBB')) +{ + exit; +} + +/** +* Cron class +* @package phpBB3 +*/ +class cron +{ + var $tasks = array(); + + function cron() { + global $config, $phpbb_root_path, $phpEx; + $modules = $config['cron_modules']; + $modules = explode(',', $modules); + foreach ($modules as $module) { + // explode will return array("") when exploding an empty string; + // users may also specify something like foo,,bar. + // Account for module being possibly empty + if (!empty($module)) { + // Misspelling or specifying nonexistent modules here may make the board + // unusable due to error messages screwing up header output + include_once($phpbb_root_path . "includes/cron/$module.$phpEx"); + $cron_class = "cron_tasks_$module"; + $object = new $cron_class; + foreach ($object->tasks as $cron_type => $params) { + $params['object'] = $object; + $this->tasks[$cron_type] = $params; + } + } + } + } + + function is_valid_task($cron_type) { + return isset($this->tasks[$cron_type]); + } + + function is_task_runnable($cron_type, $args=null) { + global $config; + $time_now = time(); + $cron_params = $this->tasks[$cron_type]; + if ($cron_params['enable_config'] && !$config[$cron_params['enable_config']]) { + return false; + } + if ($cron_param['custom_condition']) { + $callable = array($cron_params['object'], $cron_type . '_condition'); + if ($args) { + $answer = call_user_func_array($callable, $args); + } else { + $answer = call_user_func($callable); + } + if (!$answer) { + return false; + } + } + if ($time_now - $config[$cron_params['interval_config']] > $config[$cron_params['last_run_config']]) { + return true; + } + return false; + } + + function is_task_shutdown_function_compatible($cron_type) { + $cron_params = $this->tasks[$cron_type]; + if (isset($cron_params['shutdown_function_condition'])) { + return call_user_func(array($cron_params->object, $cron_type . '_shutdown_function_condition')); + } else { + return true; + } + } + + function determine_cron_mode_param() { + global $config; + if ($config['use_system_cron']) { + $mode = 'run_from_system'; + } else { + $mode_param = 'run_from_phpbb'; + } + return $mode_param; + } + + function find_one_runnable_task() { + $mode_param = $this->determine_cron_mode_param(); + foreach ($this->tasks as $cron_type => $cron_params) { + if ($cron_params[$mode_param] && $this->is_task_runnable($cron_type)) { + return $cron_type; + } + } + return null; + } + + function find_all_runnable_tasks() { + $mode_param = $this->determine_cron_mode_param(); + $tasks = array(); + foreach ($this->tasks as $cron_type => $cron_params) { + if ($cron_params[$mode_param] && $this->is_task_runnable($cron_type)) { + $tasks[] = $cron_type; + } + } + return $tasks; + } + + function generate_task_code($cron_type, $args=array()) { + $cron_params = $this->tasks[$cron_type]; + if ($cron_params['custom_code']) { + $code = call_user_func_array(array($cron_params['object'], $cron_type . '_code'), $args); + } else { + $code = $this->generate_generic_task_code($cron_type); + } + return $code; + } + + function generate_generic_task_code($cron_type) { + global $phpbb_root_path, $phpEx; + return '<img src="' . append_sid($phpbb_root_path . 'cron.' . $phpEx, 'cron_type=' . $cron_type) . '" width="1" height="1" alt="cron" />'; + } + + function run_task($cron_type) { + call_user_func(array($this->tasks[$cron_type]['object'], 'run_' . $cron_type)); + } +} |