diff options
Diffstat (limited to 'phpBB/includes/acm/acm_eaccelerator.php')
| -rw-r--r-- | phpBB/includes/acm/acm_eaccelerator.php | 142 | 
1 files changed, 79 insertions, 63 deletions
diff --git a/phpBB/includes/acm/acm_eaccelerator.php b/phpBB/includes/acm/acm_eaccelerator.php index 00d08f70d3..a1bc59d803 100644 --- a/phpBB/includes/acm/acm_eaccelerator.php +++ b/phpBB/includes/acm/acm_eaccelerator.php @@ -1,72 +1,69 @@  <?php -/**  +/**  *  * @package acm  * @version $Id$ -* @copyright (c) 2005 phpBB Group  -* @license http://opensource.org/licenses/gpl-license.php GNU Public License  +* @copyright (c) 2005 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License  *  */  /** -* @ignore -*/ -if (!defined('IN_PHPBB')) -{ -	exit; -} - -/** -* ACM eAccelerator Based Caching +* ACM Memcache Based Caching  * @package acm  */  class acm  { -	private $vars = array(); -	private $is_modified = false; +	var $vars = array(); +	var $is_modified = false; -	public $sql_rowset = array(); -	public $cache_dir = ''; +	var $sql_rowset = array(); +	var $sql_row_pointer = array(); +	var $cache_dir = '';  	/**  	* Set cache path  	*/ -	function __construct() +	function acm()  	{ -		$this->cache_dir = PHPBB_ROOT_PATH . 'cache/'; +		$this->cache_dir = $phpbb_root_path . 'cache/';  	}  	/**  	* Load global cache  	*/ -	private function load() +	function load()  	{  		// grab the global cache -		if ($this->vars = eaccelerator_get('global')) +		$temp = eaccelerator_get('global'); + +		if ($temp !== null)  		{ -			return true; +			$this->vars = $temp; +		} +		else +		{ +			return false;  		} -		return false; +		return true;  	}  	/**  	* Unload cache object  	*/ -	public function unload() +	function unload()  	{  		$this->save();  		unset($this->vars);  		unset($this->sql_rowset); - -		$this->vars = array(); -		$this->sql_rowset = array(); +		unset($this->sql_row_pointer);  	}  	/**  	* Save modified objects  	*/ -	private function save() +	function save()  	{  		if (!$this->is_modified)  		{ @@ -81,7 +78,7 @@ class acm  	/**  	* Tidy cache  	*/ -	public function tidy() +	function tidy()  	{  		eaccelerator_gc(); @@ -91,9 +88,9 @@ class acm  	/**  	* Get saved cache object  	*/ -	public function get($var_name) +	function get($var_name)  	{ -		if ($var_name[0] === '_') +		if ($var_name[0] == '_')  		{  			$temp = eaccelerator_get($var_name); @@ -119,9 +116,9 @@ class acm  	/**  	* Put data into cache  	*/ -	public function put($var_name, $var, $ttl = 31536000) +	function put($var_name, $var, $ttl = 31536000)  	{ -		if ($var_name[0] === '_') +		if ($var_name[0] == '_')  		{  			eaccelerator_put($var_name, $var, $ttl);  		} @@ -135,7 +132,7 @@ class acm  	/**  	* Purge cache data  	*/ -	public function purge() +	function purge()  	{  		// Purge all phpbb cache files  		$dir = @opendir($this->cache_dir); @@ -163,10 +160,7 @@ class acm  		unset($this->vars);  		unset($this->sql_rowset); - -		$this->vars = array(); -		$this->var_expires = array(); -		$this->sql_rowset = array(); +		unset($this->sql_row_pointer);  		$this->is_modified = false;  	} @@ -174,9 +168,9 @@ class acm  	/**  	* Destroy cache data  	*/ -	public function destroy($var_name, $table = '') +	function destroy($var_name, $table = '')  	{ -		if ($var_name === 'sql' && !empty($table)) +		if ($var_name == 'sql' && !empty($table))  		{  			if (!is_array($table))  			{ @@ -209,7 +203,7 @@ class acm  			return;  		} -		if ($var_name[0] === '_') +		if ($var_name[0] == '_')  		{  			eaccelerator_rm($var_name);  		} @@ -226,7 +220,7 @@ class acm  	/**  	* Load cached sql query  	*/ -	public function sql_load($query) +	function sql_load($query)  	{  		// Remove extra spaces and tabs  		$query = preg_replace('/[\n\r\s\t]+/', ' ', $query); @@ -241,31 +235,23 @@ class acm  		$this->sql_rowset[$query_id] = $temp; +		$this->sql_row_pointer[$query_id] = 0; +  		return $query_id;  	}  	/**  	* Save sql query  	*/ -	public function sql_save($query, &$query_result, $ttl) +	function sql_save($query, &$query_result, $ttl)  	{ -		global $db; -  		// Remove extra spaces and tabs  		$query = preg_replace('/[\n\r\s\t]+/', ' ', $query); -		// determine which tables this query belongs to: - -		// grab all the FROM tables, avoid getting a LEFT JOIN -		preg_match('/FROM \(?(\w+(?: (?!LEFT JOIN)\w+)?(?:, ?\w+(?: (?!LEFT JOIN)\w+)?)*)\)?/', $query, $regs); +		// determine which tables this query belongs to +		preg_match('/FROM \\(?(\\w+(?: \\w+)?(?:, ?\\w+(?: \\w+)?)*)\\)?/', $query, $regs);  		$tables = array_map('trim', explode(',', $regs[1])); -		// now get the LEFT JOIN -		preg_match_all('/LEFT JOIN\s+(\w+)(?: \w+)?/', $query, $result, PREG_PATTERN_ORDER); -		$tables = array_merge($tables, $result[1]); - -		$query_hash = md5($query); -  		foreach ($tables as $table_name)  		{  			if (($pos = strpos($table_name, ' ')) !== false) @@ -278,13 +264,14 @@ class acm  			{  				$temp = array();  			} -			$temp[$query_hash] = true; +			$temp[md5($query)] = true;  			eaccelerator_put('sql_' . $table_name, $temp, $ttl);  		}  		// store them in the right place  		$query_id = sizeof($this->sql_rowset);  		$this->sql_rowset[$query_id] = array(); +		$this->sql_row_pointer[$query_id] = 0;  		while ($row = $db->sql_fetchrow($query_result))  		{ @@ -292,35 +279,63 @@ class acm  		}  		$db->sql_freeresult($query_result); -		eaccelerator_put('sql_' . $query_hash, $this->sql_rowset[$query_id], $ttl); +		eaccelerator_put('sql_' . md5($query), $this->sql_rowset[$query_id], $ttl);  		$query_result = $query_id;  	}  	/** +	* Ceck if a given sql query exist in cache +	*/ +	function sql_exists($query_id) +	{ +		return isset($this->sql_rowset[$query_id]); +	} + +	/**  	* Fetch row from cache (database)  	*/ -	public function sql_fetchrow($query_id) +	function sql_fetchrow($query_id)  	{ -		list(, $row) = each($this->sql_rowset[$query_id]); +		if ($this->sql_row_pointer[$query_id] < sizeof($this->sql_rowset[$query_id])) +		{ +			return $this->sql_rowset[$query_id][$this->sql_row_pointer[$query_id]++]; +		} -		return ($row !== NULL) ? $row : false; +		return false;  	}  	/**  	* Fetch a field from the current row of a cached database result (database)  	*/ -	public function sql_fetchfield($query_id, $field) +	function sql_fetchfield($query_id, $field) +	{ +		if ($this->sql_row_pointer[$query_id] < sizeof($this->sql_rowset[$query_id])) +		{ +			return (isset($this->sql_rowset[$query_id][$this->sql_row_pointer[$query_id]][$field])) ? $this->sql_rowset[$query_id][$this->sql_row_pointer[$query_id]][$field] : false; +		} + +		return false; +	} + +	/** +	* Seek a specific row in an a cached database result (database) +	*/ +	function sql_rowseek($rownum, $query_id)  	{ -		$row = current($this->sql_rowset[$query_id]); +		if ($rownum >= sizeof($this->sql_rowset[$query_id])) +		{ +			return false; +		} -		return ($row !== false && isset($row[$field])) ? $row[$field] : false; +		$this->sql_row_pointer[$query_id] = $rownum; +		return true;  	}  	/**  	* Free memory used for a cached database result (database)  	*/ -	public function sql_freeresult($query_id) +	function sql_freeresult($query_id)  	{  		if (!isset($this->sql_rowset[$query_id]))  		{ @@ -328,6 +343,7 @@ class acm  		}  		unset($this->sql_rowset[$query_id]); +		unset($this->sql_row_pointer[$query_id]);  		return true;  	}  | 
