⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file.class.php

📁 Ajax最流行书籍
💻 PHP
字号:
<?php/** * XOAD Events File Provider file. * * <p>This file defines the {@link XOAD_Events_Storage_File} Class.</p> * <p>Example:</p> * <code> * <?php * * require_once('xoad.php'); * * require_once(XOAD_BASE . '/classes/events/storage/File.class.php'); * * $storage = new XOAD_Events_Storage_File(['container=filename']); * * $storage->postEvent('event', 'class'); * * ?> * </code> * * @author		Stanimir Angeloff * * @package		XOAD * * @subpackage	XOAD_Events * * @version		0.6.0.0 * *//** * XOAD Events Storage File Class. * * <p>This class is a {@link XOAD_Events_Storage} successor.</p> * <p>The class allows you to save events information in a * flat file.</p> * <p>Example:</p> * <code> * <?php * * require_once('xoad.php'); * * require_once(XOAD_BASE . '/classes/events/storage/File.class.php'); * * $storage = new XOAD_Events_Storage_File(['container=filename']); * * $storage->postEvent('event', 'class'); * * ?> * </code> * * @author		Stanimir Angeloff * * @package		XOAD * * @subpackage	XOAD_Events * * @version		0.6.0.0 * */class XOAD_Events_Storage_File extends XOAD_Events_Storage{	/**	 * Holds the file name where events information is saved.	 *	 * @access	protected	 *	 * @var		string	 *	 */	var $container = 'EVENTS';	/**	 * Holds the separator used in the container.	 *	 * @access	protected	 *	 * @var		string	 *	 */	var $separator = "\t***\t";	/**	 * Creates a new instance of the {@link XOAD_Events_Storage_File} class.	 *	 * @access	public	 *	 * @param	string	$dsn	The data source name and parameters to use	 *							when creating the instance.	 * 	 */	function XOAD_Events_Storage_File($dsn)	{		parent::XOAD_Events_Storage($dsn);	}	/**	 * Retrieves a static instance of the {@link XOAD_Events_Storage_File} class.	 *	 * <p>This method overrides {@link XOAD_Events_Storage::getStorage}.</p>	 *	 * @access	public	 *	 * @param	string	$dsn	The data source name and parameters to use	 *							when retrieving the instance.	 *	 * @return	object	A static instance to the	 *					{@link XOAD_Events_Storage_File} class.	 *	 * @static	 * 	 */	function &getStorage($dsn)	{		static $instance;		if ( ! isset($instance)) {			$instance = new XOAD_Events_Storage_File($dsn);		}		return $instance;	}	/**	 * Gets the absolute path to the container.	 *	 * @access	private	 *	 * @return	string	 *	 */	function getFileName()	{		if (strpos($this->container, DIRECTORY_SEPARATOR) === 0) {			return $this->container;		}		if (strlen($this->container) >= 3) {			if (			($this->container{1} == ':') &&			($this->container{2} == DIRECTORY_SEPARATOR)) {				return $this->container;			}		}		return XOAD_BASE . '/var/' . $this->container;	}	/** 	 * Posts multiple events to the container.	 *	 * <p>Valid keys for each event are:</p>	 * - event		- the event name (case-sensitive);	 * - className	- the class that is the source of the event;	 * - sender		- the sender object of the event;	 * - data		- the data associated with the event;	 * - filter		- the event filter data (case-insensitive);	 *				  using this key you can post events with	 *				  the same name but with different filter data;	 *				  the client will respond to them individually;	 * - time		- the event start time (seconds since the Unix	 *				  Epoch (January 1 1970 00:00:00 GMT);	 * - lifetime	- the event lifetime (in seconds);	 *	 * @access	public	 *	 * @param	array	$eventsData		Array containing associative arrays	 *									with information for each event.	 *	 * @return	bool	true on success, false otherwise.	 *	 */	function postMultipleEvents($eventsData)	{		$handle = @fopen($this->getFileName(), 'a');		if ( ! $handle) {			return false;		}		@ignore_user_abort(true);		flock($handle, LOCK_EX);		foreach ($eventsData as $event) {			if ( ! parent::postMultipleEvents($event)) {				continue;			}			$row = $event['event'];			$row .= $this->separator;			$row .= $event['className'];			$row .= $this->separator;			$row .= $event['time'];			$row .= $this->separator;			$row .= $event['time'] + $event['lifetime'];			$row .= $this->separator;			$row .= isset($event['filter']) ? serialize($event['filter']) : 'N;';			$row .= $this->separator;			$rowData = array();			if (isset($event['sender'])) {				$rowData['sender'] = $event['sender'];			}			if (isset($event['data'])) {				$rowData['data'] = $event['data'];			}			$row .= serialize($rowData);			$row .= "\n";			fwrite($handle, $row);		}		flock($handle, LOCK_UN);		fclose($handle);		@ignore_user_abort(false);		return true;	}	/** 	 * Deletes old events from the container.	 *	 * <p>This method is called before calling {@link filterEvents}	 * or {@link filterMultipleEvents} to delete all expired events	 * from the container.</p>	 *	 * @access	public	 *	 * @return	bool	true on success, false otherwise.	 *	 */	function cleanEvents()	{		$fileName = $this->getFileName();		$containerData = @file($fileName);		if (empty($containerData)) {			return true;		}		$handle = @fopen($fileName, 'a+');		if ( ! $handle) {			return false;		}		$time = parent::cleanEvents();		@ignore_user_abort(true);		flock($handle, LOCK_EX);		ftruncate($handle, 0);		foreach ($containerData as $row) {			list($dummy, $dummy, $dummy, $endTime, $dummy) = explode($this->separator, $row, 5);			$endTime = (double) $endTime;			if ($endTime >= $time) {				fwrite($handle, $row);			}		}		flock($handle, LOCK_UN);		fclose($handle);		@ignore_user_abort(false);		return true;	}	/** 	 * Filters the events in the container using multiple criterias.	 *	 * <p>Valid keys for each event are:</p>	 * - event		- the event name (case-sensitive);	 * - className	- the class that is the source of the event;	 * - filter		- the event filter data (case-insensitive);	 * 				  using this argument you can filter events with	 *				  the same name but with different filter data;	 * - time		- the event start time (seconds since the Unix	 *				  Epoch (January 1 1970 00:00:00 GMT).	 *	 * @access	public	 *	 * @param	array	$eventsData		Array containing associative arrays	 *									with information for each event.	 *	 * @return	array	Sequental array that contains all events that match the	 *					supplied criterias, ordered by time (ascending).	 *	 */	function filterMultipleEvents($eventsData)	{		$events = array();		$containerData = @file($this->getFileName());		if (empty($containerData)) {			return $events;		}		foreach ($eventsData as $event) {			if ( ! parent::filterMultipleEvents($event)) {				continue;			}			foreach ($containerData as $row) {				list($eventName, $className, $time, $endTime, $filter, $rowData) = explode($this->separator, $row, 6);				$filter = unserialize($filter);				$match = (strcmp($eventName, $event['event']) == 0);				$match &= (strcasecmp($className, $event['className']) == 0);				$match &= ($time > $event['time']);				if (isset($event['filter'])) {					$match &= ($filter == $event['filter']);				}				if ($match) {					$rowData = unserialize($rowData);					$events[] = array(					'event'		=>	$eventName,					'className'	=>	$className,					'filter'	=>	$filter,					'time'		=>	(double) $time,					'endTime'	=>	(double) $endTime,					'eventData'	=>	array(					'sender'	=>	(isset($rowData['sender']) ? $rowData['sender'] : null),					'data'		=>	(isset($rowData['data']) ? $rowData['data'] : null)					));				}			}		}		if ( ! empty($events)) {			usort($events, array('XOAD_Events_Storage_File', 'sortEvents'));		}		return $events;	}	/** 	 * Callback to sort events by time.	 *	 * @access	public	 *	 * @param	array	$a	Data associated with the first event.	 *	 * @param	array	$b	Data associated with the second event.	 *	 * @return	int		Less than, equal to, or greater than zero if the first	 *					event's time is considered to be respectively less than,	 *					equal to, or greater than the second event's time.	 *	 */	function sortEvents($a, $b)	{		if ($a['time'] == $b['time']) {			return 0;		}		return (($a['time'] < $b['time']) ? -1 : 1);	}}?>

⌨️ 快捷键说明

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