func_taskmanager.php

来自「sabreipb 2.1.6 utf-8中文版本!」· PHP 代码 · 共 523 行

PHP
523
字号
<?php/*+--------------------------------------------------------------------------|   Invision Power Board v2.1.6|   =============================================|   by Matthew Mecham|   (c) 2001 - 2005 Invision Power Services, Inc.|   http://www.invisionpower.com|   =============================================|   Web: http://www.invisionboard.com|   Time: Thu, 04 May 2006 17:39:49 GMT|   Release: b415613eeb952a2741ff6d53e0266428|   Licence Info: http://www.invisionboard.com/?license+---------------------------------------------------------------------------|   > $Date: 2005-10-10 14:08:54 +0100 (Mon, 10 Oct 2005) $|   > $Revision: 23 $|   > $Author: matt $+---------------------------------------------------------------------------||   > Task Manager functions|   > Script written by Matt Mecham|   > Date started: 29th September 2003|   > DBA Checked: Fri 21 May 2004|+--------------------------------------------------------------------------*/if ( ! defined( 'IN_IPB' ) ){	print "<h1>Incorrect access</h1>You cannot access this file directly.";	exit();}class func_taskmanager{	# Global	var $ipsclass;		var $type      = 'internal';	var $root_path = './';	var $time_now  = 0;	var $date_now  = array();	var $cron_key  = "";		/*-------------------------------------------------------------------------*/	//	// CONSTRUCTOR	//	/*-------------------------------------------------------------------------*/		function func_taskmanager()	{		global $ROOT_PATH;				if ( $ROOT_PATH )		{			$this->root_path = $ROOT_PATH.'/';		}		else if ( ROOT_PATH )		{			$this->root_path = ROOT_PATH;		}				if ( $_REQUEST['ck'] )		{			$this->type     = 'cron';			$this->cron_key = addslashes( substr( trim(stripslashes($this->ipsclass->txt_alphanumerical_clean($_REQUEST['ck']))), 0, 32 ) );		}				$this->time_now = time();				$this->date_now['minute']      = intval( gmdate( 'i', $this->time_now ) );		$this->date_now['hour']        = intval( gmdate( 'H', $this->time_now ) );		$this->date_now['wday']        = intval( gmdate( 'w', $this->time_now ) );		$this->date_now['mday']        = intval( gmdate( 'd', $this->time_now ) );		$this->date_now['month']       = intval( gmdate( 'm', $this->time_now ) );		$this->date_now['year']        = intval( gmdate( 'Y', $this->time_now ) );	}		/*-------------------------------------------------------------------------*/	//	// Run the task	//	/*-------------------------------------------------------------------------*/		function run_task()	{		if ( $this->type == 'internal' )		{			//-----------------------------------------			// Loaded by our image...			// ... get next job			//-----------------------------------------						$this_task = $this->ipsclass->DB->simple_exec_query( 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)															   )      );		}		else		{			//-----------------------------------------			// Cron.. load from cron key			//-----------------------------------------						$this_task = $this->ipsclass->DB->simple_exec_query( array( 'select' => '*',																		'from'   => 'task_manager',																		'where'  => "task_cronkey='".$this->cron_key."'",															   )      );				}													   		if ( $this_task['task_id'] )		{			//-----------------------------------------			// Locked?			//-----------------------------------------						if ( $this_task['task_locked'] > 0 )			{				# 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->generate_next_run($this_task);										$this->ipsclass->DB->do_update( 'task_manager', array( 'task_next_run' => $newdate, 'task_locked' => 0 ), "task_id=".$this_task['task_id'] );										$this->save_next_run_stamp();				}								# Cancel and return				return;			}							//-----------------------------------------			// Got it, now update row, lock and run..			//-----------------------------------------						$newdate = $this->generate_next_run($this_task);						$this->ipsclass->DB->do_update( 'task_manager', array( 'task_next_run' => $newdate, 'task_locked' => time() ), "task_id=".$this_task['task_id'] );						$this->save_next_run_stamp();						if ( file_exists( $this->root_path.'sources/tasks/'.$this_task['task_file'] ) )			{				require_once( $this->root_path.'sources/tasks/'.$this_task['task_file'] );				$myobj = new task_item();				$myobj->register_class( $this );				$myobj->pass_task( $this_task );				$myobj->run_task();								//-----------------------------------------				// Any shutdown queries				//-----------------------------------------								$this->ipsclass->DB->return_die = 0;								if ( count( $this->ipsclass->DB->obj['shutdown_queries'] ) )				{					foreach( $this->ipsclass->DB->obj['shutdown_queries'] as $q )					{						$this->ipsclass->DB->query( $q );					}				}								$this->ipsclass->DB->return_die = 1;								$this->ipsclass->DB->obj['shutdown_queries'] = array();			}		}	}		/*-------------------------------------------------------------------------*/	// Unlock task	/*-------------------------------------------------------------------------*/		function unlock_task($task=array())	{		if ( ! $task['task_id'] )		{			return;		}					 		$this->ipsclass->DB->do_update( 'task_manager', array( 'task_locked' => 0 ), "task_id=".$task['task_id'] );	}		/*-------------------------------------------------------------------------*/	//	// Update next run variable in the systemvars cache	//	/*-------------------------------------------------------------------------*/		function save_next_run_stamp()	{		$this_task = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'task_next_run', 'from' => 'task_manager', 'where' => 'task_enabled = 1', 'order' => 'task_next_run ASC', 'limit' => array(0,1) ) );				if ( ! $this_task['task_next_run'] )		{			//-----------------------------------------			// Fail safe...			//-----------------------------------------						$this_task['task_next_run'] = $this->time_now + 3600;		}				$cache_array = array();				$cache       = $this->ipsclass->DB->simple_exec_query( array( 'select' => '*', 'from' => 'cache_store', 'where' => "cs_key='systemvars'" ) );				$cache_array = unserialize(stripslashes($cache['cs_value']));				$cache_array['task_next_run'] = $this_task['task_next_run'];				$this->ipsclass->DB->do_update( 'cache_store', array( 'cs_value' => addslashes(serialize($cache_array)) ), "cs_key='systemvars'" );	}		/*-------------------------------------------------------------------------*/	//	// Generate next_run unix timestamp	//	/*-------------------------------------------------------------------------*/		function generate_next_run($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'] == -1 and $task['task_month_day'] == -1 )		{			$day_set = 0;		}				if ( $task['task_minute'] == -1 )		{			$min_set = 0;		}				if ( $task['task_week_day'] == -1 )		{			if ( $task['task_month_day'] != -1 )			{				$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->_add_month();					break;				case 'week':					$this->_add_day(7);					break;				default:					$this->_add_day();					break;			}		}						//-----------------------------------------		// Sort out the hour...		//-----------------------------------------				if ( $task['task_hour'] == -1)		{			$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->_add_hour( $task['task_hour'] );			}			else			{				$this->run_hour = $task['task_hour'];			}		}				//-----------------------------------------		// Can we run the minute...		//-----------------------------------------				if ( $task['task_minute'] == -1 )		{			$this->_add_minute();		}		else		{			if ( $task['task_hour'] == -1 and ! $day_set )			{				//-----------------------------------------				// Runs every X minute..				//-----------------------------------------								$this->_add_minute($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'] == -1 )			{				//-----------------------------------------				// Every hour...				//-----------------------------------------								if ( $this->run_hour == $this->date_now['hour'] and $this->run_minute <= $this->date_now['min'] )				{ 					$this->_add_hour(); 				} 			} 			else 			{ 				//----------------------------------------- 				// Every X hour, try again in x hours 				//----------------------------------------- 				 				if ( ! $day_set and ! $min_set ) 				{ 					$this->_add_hour($task['task_hour'] ); 				} 				 				//----------------------------------------- 				// Specific hour, try tomorrow 				//----------------------------------------- 				 				else if ( ! $day_set ) 				{ 					$this->_add_day(); 				} 				else 				{ 					//----------------------------------------- 					// Oops, specific day... 					//----------------------------------------- 					 					switch ( $day_increment )					{						case 'month':							$this->_add_month();							break;						case 'week':							$this->_add_day(7);							break;						default:							$this->_add_day();							break;					} 				} 			}		}				//-----------------------------------------		// Return stamp...		//-----------------------------------------				$next_run = gmmktime( $this->run_hour, $this->run_minute, 0, $this->run_month, $this->run_day, $this->run_year );				return $next_run;		}		/*-------------------------------------------------------------------------*/	//	// Add to the log file	//	/*-------------------------------------------------------------------------*/		function append_task_log($task,$desc)	{		if ( ! $task['task_log'] )		{			return;		}			$save = array( 'log_title' => $task['task_title'],					   'log_date'  => time(),					   'log_ip'    => $_SERVER['REMOTE_ADDR'],					   'log_desc'  => $desc					 );					 		$this->ipsclass->DB->do_insert( 'task_logs', $save );	}		/*-------------------------------------------------------------------------*/	//	// Add on a month for the next run time..	//	/*-------------------------------------------------------------------------*/		function _add_month()	{		if ($this->date_now['month'] == 12)		{			$this->run_month = 1;			$this->run_year++;		}		else		{			$this->run_month++;		}	}		/*-------------------------------------------------------------------------*/	//	// Add on a day for the next run time..	//	/*-------------------------------------------------------------------------*/		function _add_day($days=1)	{		if ( $this->date['mday'] >= ( gmdate( 't', $this->time_now ) - $days ) )		{			$this->run_day = ($this->date['mday'] + $days) - date( 't', $this->time_now );			$this->_add_month();		}		else		{			$this->run_day += $days;		}	}		/*-------------------------------------------------------------------------*/	//	// Add on a hour for the next run time...	//	/*-------------------------------------------------------------------------*/		function _add_hour($hour=1)	{		if ($this->date_now['hour'] >= (24 - $hour ) )		{			$this->run_hour = ($this->date_now['hour'] + $hour) - 24;			$this->_add_day();		}		else		{			$this->run_hour += $hour;		}	}		/*-------------------------------------------------------------------------*/	//	// Add on a minute...	//	/*-------------------------------------------------------------------------*/		function _add_minute($mins=1)	{		if ( $this->date_now['minute'] >= (60 - $mins) )		{			$this->run_minute = ( $this->date_now['minute'] + $mins ) - 60;			$this->_add_hour();		}		else		{			$this->run_minute += $mins;		}	}}?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?