Вход Регистрация
Файл: IPBMafia.ru_IPB_3.4.6_Final_Rus _Nulled/board/upload/admin/sources/classes/class_taskmanager.php
Строк: 412
<?php

/**
 * <pre>
 * Invision Power Services
 * IP.Board v3.4.6
 * Task Manager Library
 * Last Updated: $Date: 2012-09-18 10:15:15 -0400 (Tue, 18 Sep 2012) $
 * </pre>
 *
 * @author         $Author: mark $
 * @copyright    (c) 2001 - 2009 Invision Power Services, Inc.
 * @license        http://www.invisionpower.com/company/standards.php#license
 * @package        IP.Board
 * @link        http://www.invisionpower.com
 * @version        $Rev: 11344 $
 *
 */

if ( ! defined'IN_IPB' ) )
{
    print 
"<h1>Incorrect access</h1>You cannot access this file directly.";
    exit();
}


class 
class_taskmanager
{
    
/**
     * Type of task
     *
     * @access    protected
     * @var        string
     */
    
public $type            'internal';

    
/**
     * Current timestamp
     *
     * @access    protected
     * @var        integer
     */
    
protected $time_now        0;

    
/**
     * Date pieces
     *
     * @access    protected
     * @var        array
     */
    
public $date_now        = array();

    
/**
     * Cron key
     *
     * @access    protected
     * @var        string
     */
    
protected $cron_key        "";
    
    
/**
     * Constructer
     *
     * @access    public
     * @param    object         ipsRegistry $registry
     * @return    @e void
     */
    
public function __constructipsRegistry $registry )
    {
        
/* Setup Classes */
        
$this->registry $registry;
        
$this->lang     $this->registry->getClass('class_localization');
        
$this->DB       $this->registry->DB();
        
$this->cache    $this->registry->cache();
        
$this->caches   =& $this->registry->cache()->fetchCaches();
        
        
/* Setup Timestamps */
        
$this->time_now                time();        
        
$this->date_now['minute']      = intvalgmdate'i'$this->time_now ) );
        
$this->date_now['hour']        = intvalgmdate'H'$this->time_now ) );
        
$this->date_now['wday']        = intvalgmdate'w'$this->time_now ) );
        
$this->date_now['mday']        = intvalgmdate'd'$this->time_now ) );
        
$this->date_now['month']       = intvalgmdate'm'$this->time_now ) );
        
$this->date_now['year']        = intvalgmdate'Y'$this->time_now ) );
        
        
/* Attempt to reset timeout */
        
if ( @function_exists("set_time_limit") == and SAFE_MODE_ON == )
        {
            @
set_time_limit(0);
        }
    }
    
    
/**
     * Run a task
     *
     * @return    @e void
     */
    
public function runTask()
    {    
        if ( ( 
ipsRegistry::$request['ck'] ) AND ipsRegistry::$request['ck'] )
        {
            if ( 
ipsRegistry::$request['ck'] == 'all' )
            {
                if ( 
ipsRegistry::$settings['task_use_cron'] and ipsRegistry::$request['allpass'] == ipsRegistry::$settings['task_cron_key'] )
                {
                    
$this->type 'internal';
                }
                else
                {
                    die;
                }
            }
            else
            {            
                
$this->type     'cron';
                
$this->cron_key substrtrim(stripslashes(IPSText::alphanumericalClean(ipsRegistry::$request['ck']))), 032 );
            }
        }
                
        
/* Forcing a task? */
        
if ( defined'FORCE_TASK_KEY' ) )
        {
            
$this_task $this->DB->buildAndFetch( array(   'select' => '*',
                                                            
'from'   => 'task_manager',
                                                            
'where'  => "task_key='" FORCE_TASK_KEY "'"
                                                   
)      );
                                                   
            
/* Check to make sure the app is enabled and exists */
            
$this_task $this->_checkAppEnabled$this_task );
        }
        else if ( 
$this->type == 'internal' )
        {
            
//-----------------------------------------
            // Loaded by our image...
            // ... get next job
            //-----------------------------------------
            
            
$this_task $this->DB->buildAndFetch( array(   'select' => '*',
                                                            
'from'   => 'task_manager',
                                                            
'where'  => 'task_enabled = 1 AND task_next_run <= '.$this->time_now,
                                                            
'order'  => 'task_next_run ASC',
                                                            
'limit'  => array(0,1)
                                                   )      );
                                                                                                      
            
/* Check to make sure the app is enabled and exists */
            
$this_task $this->_checkAppEnabled$this_task );
        }
        else if ( 
$this->type == 'cron' )
        {
            
//-----------------------------------------
            // Cron.. load from cron key
            //-----------------------------------------
            
            
$this_task $this->DB->buildAndFetch( array(   'select' => '*',
                                                            
'from'   => 'task_manager',
                                                            
'where'  => "task_cronkey='".$this->cron_key."'",
                                                   )      );

            
//-----------------------------------------
            // Verify application is enabled
            //-----------------------------------------
            
            
if ( ! $this_task['task_application'] OR ! ipsRegistry::$applications$this_task['task_application'] ]['app_enabled'] )
            {
                return;
            }
        }

        if ( 
$this_task['task_id'] )
        {
            
//-----------------------------------------
            // Locked?
            //-----------------------------------------
            
            
if ( $this_task['task_locked'] > )
            {
                
# Yes - now, how long has it been locked for?
                # If longer than 30 mins, unlock as something
                # has gone wrong.
                
                
if ( $this_task['task_locked'] < time() - 1800 )
                {
                    
$newdate $this->generateNextRun($this_task);
                    
                    
$this->DB->update'task_manager', array( 'task_next_run' => $newdate'task_locked' => ), "task_id=".$this_task['task_id'] );
                    
                    
$this->saveNextRunStamp();
                }
                
                
# Cancel and return if locked
                
return;
            }
                
            
//-----------------------------------------
            // Got it, now update row, lock and run..
            //-----------------------------------------
            
            
$newdate $this->generateNextRun($this_task);
            
            
$this->DB->update'task_manager', array( 'task_next_run' => $newdate'task_locked' => time() ), "task_id=".$this_task['task_id'] );
            
            
$this->saveNextRunStamp();
            
            if ( 
is_fileIPSLib::getAppDir$this_task['task_application'] ) . '/tasks/' $this_task['task_file'] ) )
            {
                
$classToLoad IPSLib::loadLibraryIPSLib::getAppDir$this_task['task_application'] ) . '/tasks/' $this_task['task_file'], 'task_item'$this_task['task_application'] );
                
$myobj = new $classToLoad$this->registry$this$this_task );
                
$myobj->runTask();
                                
                
//-----------------------------------------
                // Any shutdown queries
                //-----------------------------------------
                
                
$this->DB->return_die 0;
                
                if ( 
count$this->DB->obj['shutdown_queries'] ) )
                {
                    foreach( 
$this->DB->obj['shutdown_queries'] as $q )
                    {
                        
$this->DB->query$q );
                    }
                }
                
                
$this->DB->return_die 1;
                
                
$this->DB->obj['shutdown_queries'] = array();
            }
        }
    }
    
    
/**
     * Unlock a task
     *
     * @access    public
     * @param    mixed        Task array|Task id
     * @return    boolean
     */
    
public function unlockTask$task )
    {
        if( 
is_array($task) AND count($task) )
        {
            if ( empty(
$task['task_id']) )
            {
                return 
false;
            }
            
            
$task_id $task['task_id'];
        }
        else if( 
intval($task) > )
        {
            
$task_id intval($task);
        }
        else
        {
            return 
false;
        }
                     
        
$this->DB->update'task_manager', array( 'task_locked' => ), 'task_id=' $task_id );
        
        return 
true;
    }

    
/**
     * Update the task's next run timestamp
     *
     * @access    public
     * @return    @e void
     */
    
public function saveNextRunStamp()
    {
        
/* Query the task rund ate */
        
$this_task  $this->DB->buildAndFetch( array( 'select' => 'task_next_run''from' => 'task_manager''where' => 'task_enabled = 1''order' => 'task_next_run ASC''limit' => array(0,1) ) );
        
        
/* Get the cache */
        
$task_cache $this->caches['systemvars'];
        
        
/* Fail safe */
        
if ( ! $this_task['task_next_run'] )
        {
            
$this_task['task_next_run'] = $this->time_now 3600;
        }
        
        
/* Set new date */
        
$task_cache['task_next_run'] = $this_task['task_next_run'];
        
        
/* Save Cache */
        
ipsRegistry::cache()->setCache'systemvars'$task_cache, array( 'array' => 1'donow' => ) );
    }
    
    
/**
     * Generate the next run timestamp
     *
     * @access    public
     * @param    array         Task data
     * @return    int            Next run timestamp
     */
    
public function generateNextRun($task=array())
    {
        
//-----------------------------------------
        // Did we set a day?
        //-----------------------------------------
        
        
$day_set       1;
        
$min_set       1;
        
$day_increment 0;
        
        
$this->run_day    $this->date_now['wday'];
        
$this->run_minute $this->date_now['minute'];
        
$this->run_hour   $this->date_now['hour'];
        
$this->run_month  $this->date_now['month'];
        
$this->run_year   $this->date_now['year'];
        
        if ( 
$task['task_week_day'] == -and $task['task_month_day'] == -)
        {
            
$day_set 0;
        }
        
        if ( 
$task['task_minute'] == -)
        {
            
$min_set 0;
        }
        
        if ( 
$task['task_week_day'] == -)
        {
            if ( 
$task['task_month_day'] != -)
            {
                
$this->run_day $task['task_month_day'];
                
$day_increment 'month';
            }
            else
            {
                
$this->run_day $this->date_now['mday'];
                
$day_increment 'anyday';
            }
        }
        else
        {
            
//-----------------------------------------
            // Calc. next week day from today
            //-----------------------------------------
            
            
$this->run_day $this->date_now['mday'] + ( $task['task_week_day'] - $this->date_now['wday'] );
            
            
$day_increment 'week';
        }
        
        
//-----------------------------------------
        // If the date to run next is less
        // than today, best fetch the next
        // time...
        //-----------------------------------------
        
        
if ( $this->run_day $this->date_now['mday'] )
        {
            switch ( 
$day_increment )
            {
                case 
'month':
                    
$this->_addMonth();
                    break;
                case 
'week':
                    
$this->_addDay(7);
                    break;
                default:
                    
$this->_addDay();
                    break;
            }
        }
            
        
//-----------------------------------------
        // Sort out the hour...
        //-----------------------------------------
        
        
if ( $task['task_hour'] == -1)
        {
            
/* If week, month are -1 and min =0 then on the hour, otherwise: */
            
if ( ! $day_set AND $task['task_minute'] == )
            {
                
$this->_addHour);
            }
            else
            {
                
$this->run_hour $this->date_now['hour'];
            }
        }
        else
        {
            
//-----------------------------------------
            // If ! min and ! day then it's
            // every X hour
            //-----------------------------------------
            
            
if ( ! $day_set and ! $min_set )
            {
                
$this->_addHour$task['task_hour'] );
            }
            else
            {
                
$this->run_hour $task['task_hour'];
            }
        }
        
        
//-----------------------------------------
        // Can we run the minute...
        //-----------------------------------------
        
        
if ( $task['task_minute'] == -)
        {
            
$this->_addMinute();
        }
        else
        {
            if ( 
$task['task_hour'] == -and ! $day_set )
            {
                
//-----------------------------------------
                // Runs every X minute..
                //-----------------------------------------
                
                
$this->_addMinute($task['task_minute']);
            }
            else
            {
                
//-----------------------------------------
                // runs at hh:mm
                //-----------------------------------------
                
                
$this->run_minute $task['task_minute'];
            }
        }
        
        if ( 
$this->run_hour <= $this->date_now['hour'] and $this->run_day == $this->date_now['mday'] )
        {
            if ( 
$task['task_hour'] == -)
            {
                
//-----------------------------------------
                // Every hour...
                //-----------------------------------------
                
                
if ( $this->run_hour == $this->date_now['hour'] and $this->run_minute <= $this->date_now['min'] )
                {
                     
$this->_addHour();
                 }
             }
             else
             {
                 
//-----------------------------------------
                 // Every X hour, try again in x hours
                 //-----------------------------------------
                 
                 
if ( ! $day_set and ! $min_set )
                 {
                     
$this->_addHour($task['task_hour'] );
                 }
                 
                 
//-----------------------------------------
                 // Specific hour, try tomorrow
                 //-----------------------------------------
                 
                 
else if ( ! $day_set )
                 {
                     
$this->_addDay();
                 }
                 else
                 {
                     
//-----------------------------------------
                     // Oops, specific day...
                     //-----------------------------------------
                     
                     
switch ( $day_increment )
                    {
                        case 
'month':
                            
$this->_addMonth();
                            break;
                        case 
'week':
                            
$this->_addDay(7);
                            break;
                        default:
                            
$this->_addDay();
                            break;
                    }
                 }
             }
        }
        
        
//-----------------------------------------
        // Return stamp...
        //-----------------------------------------
        
        
$next_run gmmktime$this->run_hour$this->run_minute0$this->run_month$this->run_day$this->run_year );
         
        return 
$next_run;
    
    }
    
    
/**
     * Add to the log file
     *
     * @access    public
     * @param    array         Task data
     * @param     string        Description to add to the log file
     * @return    @e void
     */
    
public function appendTaskLog$task$desc )
    {
        if ( ! 
$task['task_log'] )
        {
            return;
        }
    
        
$save = array( 'log_title' => $task['task_title'],
                       
'log_date'  => time(),
                       
'log_ip'    => my_getenv('REMOTE_ADDR'),
                       
'log_desc'  => $desc
                      
);
                     
        
$this->DB->insert'task_logs'$save );
    }
    
    
/**
     * Add a month to the next run timestamp
     *
     * @access    protected
     * @return    @e void
     */
    
protected function _addMonth()
    {
        if (
$this->date_now['month'] == 12)
        {
            
$this->run_month 1;
            
$this->run_year++;
        }
        else
        {
            
$this->run_month++;
        }
    }
    
    
/**
     * Add a day to the next run timestamp
     *
     * @access    protected
     * @param    integer        Number of days to add
     * @return    @e void
     */
    
protected function _addDay($days=1)
    {
        if ( 
$this->date_now['mday'] >= ( gmdate't'$this->time_now ) - $days ) )
        {
            
$this->run_day = ($this->date_now['mday'] + $days) - date't'$this->time_now );
            
$this->_addMonth();
        }
        else
        {
            
$this->run_day += $days;
        }
    }
    
    
/**
     * Add an hour to the next run timestamp
     *
     * @access    protected
     * @param    integer        Number of hours to add
     * @return    @e void
     */
    
protected function _addHour($hour=1)
    {
        if (
$this->date_now['hour'] >= (24 $hour ) )
        {
            
$this->run_hour = ($this->date_now['hour'] + $hour) - 24;
            
$this->_addDay();
        }
        else
        {
            
$this->run_hour += $hour;
        }
    }
    
    
/**
     * Add a minute to the next run timestamp
     *
     * @access    protected
     * @param    integer        Number of minutes to add
     * @return    @e void
     */
    
protected function _addMinute($mins=1)
    {
        if ( 
$this->date_now['minute'] >= (60 $mins) )
        {
            
$this->run_minute = ( $this->date_now['minute'] + $mins ) - 60;
            
$this->_addHour();
        }
        else
        {
            
$this->run_minute += $mins;
        }
    }
    
    
/**
     * Ensure app exists and is enabled
     *
     * @param        array    Task Data
     * @return        array    Task Data
     */
    
protected function _checkAppEnabled$task )
    {
        if ( ! 
$task['task_application'] OR ! ipsRegistry::$applications$task['task_application'] ]['app_enabled'] )
        {
            
/* Best update them all */
            
$_apps = array();
            
            foreach( 
IPSLib::getEnabledApplications() as $appDir => $appData )
            {
                
$_apps[] = "'" $appDir "'";
            }
            
            
$this->DB->update'task_manager', array( 'task_enabled' => ), 'task_application NOT IN (' implode','$_apps ) . ')' );
            
            
/* Fetch task again */
            
$task $this->DB->buildAndFetch( array(    'select'    => '*',
                                                        
'from'        => 'task_manager',
                                                        
'where'        => 'task_enabled = 1 AND task_next_run <= '.$this->time_now,
                                                        
'order'        => 'task_next_run ASC',
                                                        
'limit'        => array(0,1) ) );
                                               
        }
        
        return 
$task;    
    }
}
Онлайн: 0
Реклама