diff options
Diffstat (limited to 'phpBB/phpbb/cache/driver/file.php')
| -rw-r--r-- | phpBB/phpbb/cache/driver/file.php | 278 | 
1 files changed, 54 insertions, 224 deletions
| diff --git a/phpBB/phpbb/cache/driver/file.php b/phpBB/phpbb/cache/driver/file.php index 6686da6953..bb055d3acf 100644 --- a/phpBB/phpbb/cache/driver/file.php +++ b/phpBB/phpbb/cache/driver/file.php @@ -1,9 +1,13 @@  <?php  /**  * -* @package acm -* @copyright (c) 2005, 2009 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file.  *  */ @@ -11,29 +15,36 @@ namespace phpbb\cache\driver;  /**  * ACM File Based Caching -* @package acm  */  class file extends \phpbb\cache\driver\base  { -	var $vars = array();  	var $var_expires = array(); -	var $is_modified = false; -	var $sql_rowset = array(); -	var $sql_row_pointer = array(); -	var $cache_dir = ''; +	/** +	 * @var	\phpbb\filesystem\filesystem_interface +	 */ +	protected $filesystem;  	/**  	* Set cache path +	* +	* @param string $cache_dir Define the path to the cache directory (default: $phpbb_root_path . 'cache/')  	*/  	function __construct($cache_dir = null)  	{ -		global $phpbb_root_path; -		$this->cache_dir = !is_null($cache_dir) ? $cache_dir : $phpbb_root_path . 'cache/'; +		global $phpbb_root_path, $phpbb_container; + +		$this->cache_dir = !is_null($cache_dir) ? $cache_dir : $phpbb_root_path . 'cache/' . $phpbb_container->getParameter('core.environment') . '/'; +		$this->filesystem = new \phpbb\filesystem\filesystem(); + +		if (!is_dir($this->cache_dir)) +		{ +			@mkdir($this->cache_dir, 0777, true); +		}  	}  	/** -	* Load global cache +	* {@inheritDoc}  	*/  	function load()  	{ @@ -41,24 +52,17 @@ class file extends \phpbb\cache\driver\base  	}  	/** -	* Unload cache object +	* {@inheritDoc}  	*/  	function unload()  	{ -		$this->save(); -		unset($this->vars); +		parent::unload();  		unset($this->var_expires); -		unset($this->sql_rowset); -		unset($this->sql_row_pointer); - -		$this->vars = array();  		$this->var_expires = array(); -		$this->sql_rowset = array(); -		$this->sql_row_pointer = array();  	}  	/** -	* Save modified objects +	* {@inheritDoc}  	*/  	function save()  	{ @@ -71,14 +75,8 @@ class file extends \phpbb\cache\driver\base  		if (!$this->_write('data_global'))  		{ -			if (!function_exists('phpbb_is_writable')) -			{ -				global $phpbb_root_path; -				include($phpbb_root_path . 'includes/functions.' . $phpEx); -			} -  			// Now, this occurred how often? ... phew, just tell the user then... -			if (!phpbb_is_writable($this->cache_dir)) +			if (!$this->filesystem->is_writable($this->cache_dir))  			{  				// We need to use die() here, because else we may encounter an infinite loop (the message handler calls $cache->unload())  				die('Fatal: ' . $this->cache_dir . ' is NOT writable.'); @@ -93,11 +91,11 @@ class file extends \phpbb\cache\driver\base  	}  	/** -	* Tidy cache +	* {@inheritDoc}  	*/  	function tidy()  	{ -		global $phpEx; +		global $config, $phpEx;  		$dir = @opendir($this->cache_dir); @@ -151,18 +149,16 @@ class file extends \phpbb\cache\driver\base  			}  		} -		set_config('cache_last_gc', time(), true); +		$config->set('cache_last_gc', time(), false);  	}  	/** -	* Get saved cache object +	* {@inheritDoc}  	*/  	function get($var_name)  	{  		if ($var_name[0] == '_')  		{ -			global $phpEx; -  			if (!$this->_exists($var_name))  			{  				return false; @@ -177,7 +173,7 @@ class file extends \phpbb\cache\driver\base  	}  	/** -	* Put data into cache +	* {@inheritDoc}  	*/  	function put($var_name, $var, $ttl = 31536000)  	{ @@ -194,93 +190,16 @@ class file extends \phpbb\cache\driver\base  	}  	/** -	* Purge cache data +	* {@inheritDoc}  	*/  	function purge()  	{ -		// Purge all phpbb cache files -		try -		{ -			$iterator = new \DirectoryIterator($this->cache_dir); -		} -		catch (Exception $e) -		{ -			return; -		} - -		foreach ($iterator as $fileInfo) -		{ -			if ($fileInfo->isDot()) -			{ -				continue; -			} -			$filename = $fileInfo->getFilename(); -			if ($fileInfo->isDir()) -			{ -				$this->remove_dir($fileInfo->getPathname()); -			} -			elseif (strpos($filename, 'container_') === 0 || -				strpos($filename, 'url_matcher') === 0 || -				strpos($filename, 'sql_') === 0 || -				strpos($filename, 'data_') === 0) -			{ -				$this->remove_file($fileInfo->getPathname()); -			} -		} - -		unset($this->vars); -		unset($this->var_expires); -		unset($this->sql_rowset); -		unset($this->sql_row_pointer); - -		$this->vars = array(); +		parent::purge();  		$this->var_expires = array(); -		$this->sql_rowset = array(); -		$this->sql_row_pointer = array(); - -		$this->is_modified = false; -	} - -	/** -	* Remove directory -	* -	* @param string $dir Directory to remove -	* -	* @return null -	*/ -	protected function remove_dir($dir) -	{ -		try -		{ -			$iterator = new \DirectoryIterator($dir); -		} -		catch (Exception $e) -		{ -			return; -		} - -		foreach ($iterator as $fileInfo) -		{ -			if ($fileInfo->isDot()) -			{ -				continue; -			} - -			if ($fileInfo->isDir()) -			{ -				$this->remove_dir($fileInfo->getPathname()); -			} -			else -			{ -				$this->remove_file($fileInfo->getPathname()); -			} -		} - -		@rmdir($dir);  	}  	/** -	* Destroy cache data +	* {@inheritDoc}  	*/  	function destroy($var_name, $table = '')  	{ @@ -359,13 +278,14 @@ class file extends \phpbb\cache\driver\base  	}  	/** -	* Check if a given cache entry exist +	* {@inheritDoc}  	*/  	function _exists($var_name)  	{  		if ($var_name[0] == '_')  		{  			global $phpEx; +			$var_name = $this->clean_varname($var_name);  			return file_exists($this->cache_dir . 'data' . $var_name . ".$phpEx");  		}  		else @@ -385,34 +305,14 @@ class file extends \phpbb\cache\driver\base  	}  	/** -	* Load cached sql query -	*/ -	function sql_load($query) -	{ -		// Remove extra spaces and tabs -		$query = preg_replace('/[\n\r\s\t]+/', ' ', $query); - -		if (($rowset = $this->_read('sql_' . md5($query))) === false) -		{ -			return false; -		} - -		$query_id = sizeof($this->sql_rowset); -		$this->sql_rowset[$query_id] = $rowset; -		$this->sql_row_pointer[$query_id] = 0; - -		return $query_id; -	} - -	/**  	* {@inheritDoc}  	*/ -	function sql_save(\phpbb\db\driver\driver $db, $query, $query_result, $ttl) +	function sql_save(\phpbb\db\driver\driver_interface $db, $query, $query_result, $ttl)  	{  		// Remove extra spaces and tabs  		$query = preg_replace('/[\n\r\s\t]+/', ' ', $query); -		$query_id = sizeof($this->sql_rowset); +		$query_id = md5($query);  		$this->sql_rowset[$query_id] = array();  		$this->sql_row_pointer[$query_id] = 0; @@ -422,7 +322,7 @@ class file extends \phpbb\cache\driver\base  		}  		$db->sql_freeresult($query_result); -		if ($this->_write('sql_' . md5($query), $this->sql_rowset[$query_id], $ttl + time(), $query)) +		if ($this->_write('sql_' . $query_id, $this->sql_rowset[$query_id], $ttl + time(), $query))  		{  			return $query_id;  		} @@ -431,70 +331,6 @@ class file extends \phpbb\cache\driver\base  	}  	/** -	* 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) -	*/ -	function sql_fetchrow($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 false; -	} - -	/** -	* Fetch a field from the current row of a cached database result (database) -	*/ -	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) -	{ -		if ($rownum >= sizeof($this->sql_rowset[$query_id])) -		{ -			return false; -		} - -		$this->sql_row_pointer[$query_id] = $rownum; -		return true; -	} - -	/** -	* Free memory used for a cached database result (database) -	*/ -	function sql_freeresult($query_id) -	{ -		if (!isset($this->sql_rowset[$query_id])) -		{ -			return false; -		} - -		unset($this->sql_rowset[$query_id]); -		unset($this->sql_row_pointer[$query_id]); - -		return true; -	} - -	/**  	* Read cached data from a specified file  	*  	* @access private @@ -505,6 +341,7 @@ class file extends \phpbb\cache\driver\base  	{  		global $phpEx; +		$filename = $this->clean_varname($filename);  		$file = "{$this->cache_dir}$filename.$phpEx";  		$type = substr($filename, 0, strpos($filename, '_')); @@ -687,6 +524,7 @@ class file extends \phpbb\cache\driver\base  	{  		global $phpEx; +		$filename = $this->clean_varname($filename);  		$file = "{$this->cache_dir}$filename.$phpEx";  		$lock = new \phpbb\lock\flock($file); @@ -736,13 +574,14 @@ class file extends \phpbb\cache\driver\base  			fclose($handle); -			if (!function_exists('phpbb_chmod')) +			try  			{ -				global $phpbb_root_path; -				include($phpbb_root_path . 'includes/functions.' . $phpEx); +				$this->filesystem->phpbb_chmod($file, CHMOD_READ | CHMOD_WRITE); +			} +			catch (\phpbb\filesystem\exception\filesystem_exception $e) +			{ +				// Do nothing  			} - -			phpbb_chmod($file, CHMOD_READ | CHMOD_WRITE);  			$return_value = true;  		} @@ -757,22 +596,13 @@ class file extends \phpbb\cache\driver\base  	}  	/** -	* Removes/unlinks file +	* Replace slashes in the file name +	* +	* @param string $varname name of a cache variable +	* @return string $varname name that is safe to use as a filename  	*/ -	function remove_file($filename, $check = false) +	protected function clean_varname($varname)  	{ -		if (!function_exists('phpbb_is_writable')) -		{ -			global $phpbb_root_path, $phpEx; -			include($phpbb_root_path . 'includes/functions.' . $phpEx); -		} - -		if ($check && !phpbb_is_writable($this->cache_dir)) -		{ -			// E_USER_ERROR - not using language entry - intended. -			trigger_error('Unable to remove files within ' . $this->cache_dir . '. Please check directory permissions.', E_USER_ERROR); -		} - -		return @unlink($filename); +		return str_replace('/', '-', $varname);  	}  } | 
