Вход Регистрация
Файл: core/classes/cron.class.php
Строк: 268
<?php
/******************************************************************************/
//                                                                            //
//                             InstantCMS v1.10                               //
//                        http://www.instantcms.ru/                           //
//                                                                            //
//                   written by InstantCMS Team, 2007-2012                    //
//                produced by InstantSoft, (www.instantsoft.ru)               //
//                                                                            //
//                        LICENSED BY GNU/GPL v2                              //
//                                                                            //
/******************************************************************************/

class cmsCron {

    private static 
$instance;

// ============================================================================ //
// ============================================================================ //

    
private function __construct() {}

    private function 
__clone() {}

    public static function 
getInstance() {
        if (
self::$instance === null) {
            
self::$instance = new self;
        }
        return 
self::$instance;
    }

// ============================================================================ //
// ============================================================================ //

    /**
     * Регистрирует новую задачу СRON
     * @param str $job_name
     * @param array $action (interval, component, model_method, custom_file, comment)
     * @return bool
     */
    
public static function registerJob($job_name$job){

        
$inDB cmsDatabase::getInstance();

        if (!isset(
$job['enabled'])) { $job['enabled'] = 1; }
        if (!isset(
$job['class_name'])) { $job['class_name'] = ''; }
        if (!isset(
$job['class_method'])) { $job['class_method'] = ''; }

        
$sql "INSERT INTO cms_cron_jobs (job_name, job_interval, job_run_date,
                                           component, model_method, custom_file,
                                           is_enabled, is_new, comment,
                                           class_name, class_method)
                VALUES ('
{$job_name}', '{$job['interval']}', CURRENT_TIMESTAMP,
                        '
{$job['component']}', '{$job['model_method']}', '{$job['custom_file']}',
                        '
{$job['enabled']}', '1', '{$job['comment']}',
                        '
{$job['class_name']}', '{$job['class_method']}')";

        
$inDB->query($sql);

        return 
true;

    }

    
/**
     * Обновляет описание задачи СRON
     * @param int $job_id
     * @param array $action (interval, component, model_method, custom_file, comment, enabled)
     * @return bool
     */
    
public static function updateJob($job_id$job){

        
$inDB cmsDatabase::getInstance();

        
$sql "UPDATE cms_cron_jobs
                SET job_name = '
{$job['name']}',
                    job_interval = '
{$job['interval']}',
                    component = '
{$job['component']}',
                    model_method = '
{$job['model_method']}',
                    custom_file = '
{$job['custom_file']}',
                    is_enabled = '
{$job['enabled']}',
                    comment = '
{$job['comment']}',
                    class_method = '
{$job['class_method']}',
                    class_name = '
{$job['class_name']}'
                WHERE id = '
{$job_id}'";

        
$inDB->query($sql);

        return 
true;

    }

// ============================================================================ //
// ============================================================================ //

    /**
     * Находит описание задачи CRON по названию
     * @param str $job_name
     * @param bool $only_enabled
     * @return array | false
     */
    
public static function getJob($job_name$only_enabled=true){

        
$inDB cmsDatabase::getInstance();

        
$enabled $only_enabled 'AND is_enabled=1' '';

        
$job $inDB->get_fields('cms_cron_jobs'"job_name='{$job_name}{$enabled}"'*');

        return 
is_array($job) ? $job false;

    }

    
/**
     * Находит описание задачи CRON по id
     * @param str $job_name
     * @param bool $only_enabled
     * @return array | false
     */
    
public static function getJobById($job_id){

        
$inDB cmsDatabase::getInstance();

        
$job $inDB->get_fields('cms_cron_jobs'"id='{$job_id}'"'*');

        return 
is_array($job) ? $job false;

    }

// ============================================================================ //
// ============================================================================ //

    /**
     * Возвращает список задач CRON
     * @param bool $only_enabled Только активные
     * @param bool $only_custom Только задачи выполнения скрипта
     * @return array
     */
    
public static function getJobs($only_enabled=true$only_custom=false){

        
$inDB cmsDatabase::getInstance();

        
$enabled $only_enabled 'AND is_enabled=1' '';

        
$custom $only_custom "AND component='' AND model_method='' AND class_name='' AND class_method=''" '';

        
$sql "SELECT id,
                       job_name as name,
                       job_interval,
                       job_run_date as run_date,
                       component,
                       model_method,
                       custom_file,
                       is_enabled,
                       is_new,
                       comment,
                       class_name,
                       class_method

                FROM cms_cron_jobs

                WHERE 1=1 
{$enabled} {$custom}

                ORDER BY job_run_date ASC

                "
;

        
$result $inDB->query($sql);

        if (!
$inDB->num_rows($result)){ return false; }

        
$jobs = array();

        while(
$job $inDB->fetch_assoc($result)){

            
$job['hours_ago'] = round((time() - strtotime($job['run_date']))/36002);

            
$jobs[] = $job;

        }

        return 
$jobs;

    }

// ============================================================================ //
// ============================================================================ //

    /**
     * Удаляет задачу CRON
     * @param string $job_name
     * @return bool
     */
    
public static function removeJob($job_name){
        
        
$inDB cmsDatabase::getInstance();        
       
        
$sql "DELETE 
                FROM cms_cron_jobs
                WHERE job_name = '
{$job_name}'";

        
$inDB->query($sql);

        return 
true;
        
    }

    
/**
     * Удаляет задачу CRON по id
     * @param int $job_id
     * @return bool
     */
    
public static function removeJobById($job_id){

        
$inDB cmsDatabase::getInstance();

        
$sql "DELETE
                FROM cms_cron_jobs
                WHERE id = '
{$job_id}'";

        
$inDB->query($sql);

        return 
true;

    }

    
/**
     * Изменяет активность задачи
     * @param int $job_id ID задачи
     * @param bool $is_enabled Активность
     * @return bool
     */
    
public static function jobEnabled($job_id$is_enabled){

        
$is_enabled = (int)$is_enabled;

        
$inDB cmsDatabase::getInstance();

        
$sql "UPDATE cms_cron_jobs SET is_enabled = '{$is_enabled}' WHERE id = '{$job_id}'";

        
$inDB->query($sql);

        return 
true;

    }


// ============================================================================ //
// ============================================================================ //

    /**
     * Отмечает задачу как успешно выполненную
     * @param int $job_id ID задачи
     * @return bool
     */
    
public static function jobSuccess($job_id){
        
        
$inDB cmsDatabase::getInstance();        
       
        
$sql "UPDATE cms_cron_jobs SET job_run_date = CURRENT_TIMESTAMP, is_new = 0 WHERE id = '{$job_id}'";

        
$inDB->query($sql);

        return 
true;
        
    }

// ============================================================================ //
// ============================================================================ //

    /**
     * Выполняет задачу с указанным ID
     * @param int $job_id
     */
    
public static function executeJobById($job_id){

        
$job self::getJobById($job_id);
        return 
self::executeJob($job);

    }

    
/**
     * Выполняет переданную задачу
     * @param array $job
     */
    
public static function executeJob($job){

        
$inCore cmsCore::getInstance();

        
$job_result true;

        
/* ================================================ */
        /* ==============  внешний php-файл  ============== */
        /* ================================================ */
        
if ($job['custom_file']){

            
$inCore->includeFile(ltrim($job['custom_file'], '/'));

        }

        
/* ================================================ */
        /* ================  метод модели ================= */
        /* ================================================ */
        
if ($job['component'] && $job['model_method']){

            
$inCore->loadModel($job['component']);

            
$classname  "cms_model_{$job['component']}";

            if (
class_exists($classname)) {

                
$model = new $classname();

                if (
method_exists($model$job['model_method'])){

                    
$job_result call_user_func(array($model$job['model_method']));
                    
                }

            }

        }

        
/* ================================================ */
        /* =================  метод класса ================ */
        /* ================================================ */
        
if ($job['class_name'] && $job['class_method']){

            
$classfile '';

            if (!
mb_strstr($job['class_name'], '|')){
                
$classname $job['class_name'];
            } else {
                
$job['class_name'] = explode('|'$job['class_name']);
                
$classfile $job['class_name'][0];
                
$classname $job['class_name'][1];
            }

            if (
$classfile){ $inCore->loadClass($classfile); }

            if (
class_exists($classname)) {

                if (
method_exists($classname$job['class_method'])){

                    
$job_result $job_result && call_user_func(array($classname$job['class_method']));

                }

            }

        }

        if (
$job_result){ self::jobSuccess($job['id']); }

        return 
$job_result;

    }


// ============================================================================ //
// ============================================================================ //
    
}
?>
Онлайн: 1
Реклама