/libraries/joomla/cache/storage/file.php
https://gitlab.com/endomorphosis/greenrenaissancejoomla · PHP · 230 lines · 119 code · 17 blank · 94 comment · 24 complexity · 97d1f9ea8868fea4aa8d3c437a3f69f3 MD5 · raw file
- <?php
- /**
- * @version $Id: file.php 10071 2008-02-27 19:17:32Z ian $
- * @package Joomla.Framework
- * @subpackage Cache
- * @copyright Copyright (C) 2005 - 2008 Open Source Matters. All rights reserved.
- * @license GNU/GPL, see LICENSE.php
- * Joomla! is free software. This version may have been modified pursuant
- * to the GNU General Public License, and as distributed it includes or
- * is derivative of works licensed under the GNU General Public License or
- * other free or open source software licenses.
- * See COPYRIGHT.php for copyright notices and details.
- */
-
- // Check to ensure this file is within the rest of the framework
- defined('JPATH_BASE') or die();
-
- /**
- * File cache storage handler
- *
- * @author Louis Landry <louis.landry@joomla.org>
- * @package Joomla.Framework
- * @subpackage Cache
- * @since 1.5
- */
- class JCacheStorageFile extends JCacheStorage
- {
- /**
- * Constructor
- *
- * @access protected
- * @param array $options optional parameters
- */
- function __construct( $options = array() )
- {
- parent::__construct($options);
-
- $config =& JFactory::getConfig();
- $this->_root = $options['cachebase'];
- $this->_hash = $config->getValue('config.secret');
- }
-
- /**
- * Get cached data from a file by id and group
- *
- * @access public
- * @param string $id The cache data id
- * @param string $group The cache data group
- * @param boolean $checkTime True to verify cache time expiration threshold
- * @return mixed Boolean false on failure or a cached data string
- * @since 1.5
- */
- function get($id, $group, $checkTime)
- {
- $data = false;
-
- $path = $this->_getFilePath($id, $group);
- clearstatcache();
- if (is_file($path)) {
- if ($checkTime) {
- if (@ filemtime($path) > $this->_threshold) {
- $data = file_get_contents($path);
- }
- } else {
- $data = file_get_contents($path);
- }
- }
- return $data;
- }
-
- /**
- * Store the data to a file by id and group
- *
- * @access public
- * @param string $id The cache data id
- * @param string $group The cache data group
- * @param string $data The data to store in cache
- * @return boolean True on success, false otherwise
- * @since 1.5
- */
- function store($id, $group, $data)
- {
- $written = false;
- $path = $this->_getFilePath($id, $group);
-
- $fp = @fopen($path, "wb");
- if ($fp) {
- if ($this->_locking) {
- @flock($fp, LOCK_EX);
- }
- $len = strlen($data);
- @fwrite($fp, $data, $len);
- if ($this->_locking) {
- @flock($fp, LOCK_UN);
- }
- @fclose($fp);
- $written = true;
- }
- // Data integrity check
- if ($written && ($data == file_get_contents($path))) {
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * Remove a cached data file by id and group
- *
- * @access public
- * @param string $id The cache data id
- * @param string $group The cache data group
- * @return boolean True on success, false otherwise
- * @since 1.5
- */
- function remove($id, $group)
- {
- $path = $this->_getFilePath($id, $group);
- if (!@unlink($path)) {
- return false;
- }
- return true;
- }
-
- /**
- * Clean cache for a group given a mode.
- *
- * group mode : cleans all cache in the group
- * notgroup mode : cleans all cache not in the group
- *
- * @access public
- * @param string $group The cache data group
- * @param string $mode The mode for cleaning cache [group|notgroup]
- * @return boolean True on success, false otherwise
- * @since 1.5
- */
- function clean($group, $mode)
- {
- jimport('joomla.filesystem.folder');
-
- $return = true;
- $folder = $group;
-
- if(trim($folder) == '') {
- $mode = 'notgroup';
- }
-
- switch ($mode)
- {
- case 'notgroup':
- $folders = JFolder::folders($this->_root);
- for ($i=0,$n=count($folders);$i<$n;$i++)
- {
- if ($folders[$i] != $folder) {
- $return |= JFolder::delete($this->_root.DS.$folders[$i]);
- }
- }
- break;
- case 'group':
- default:
- if (is_dir($this->_root.DS.$folder)) {
- $return = JFolder::delete($this->_root.DS.$folder);
- }
- break;
- }
- return $return;
- }
-
- /**
- * Garbage collect expired cache data
- *
- * @access public
- * @return boolean True on success, false otherwise.
- */
- function gc()
- {
- $result = true;
- // files older than lifeTime get deleted from cache
- if (!is_null($this->_lifeTime)) {
- $files = JFolder::files($this->_root, '.', true, true);
- for ($i=0,$n=count($files);$i<$n;$i++)
- {
- if (@ filemtime($files[$i]) < $this->_threshold) {
- $result |= JFile::delete($files[$i]);
- }
- }
- }
- return $result;
- }
-
- /**
- * Test to see if the cache storage is available.
- *
- * @static
- * @access public
- * @return boolean True on success, false otherwise.
- */
- function test()
- {
- $config =& JFactory::getConfig();
- $root = $config->getValue('config.cache_path', JPATH_ROOT.DS.'cache');
- return is_writable($root);
- }
-
- /**
- * Get a cache file path from an id/group pair
- *
- * @access private
- * @param string $id The cache data id
- * @param string $group The cache data group
- * @return string The cache file path
- * @since 1.5
- */
- function _getFilePath($id, $group)
- {
- $folder = $group;
- $name = md5($this->_application.'-'.$id.'-'.$this->_hash.'-'.$this->_language).'.cache';
-
- // If the folder doesn't exist try to create it
- if (!is_dir($this->_root.DS.$folder)) {
- @mkdir($this->_root.DS.$folder);
- }
-
- // Make sure the folder exists
- if (!is_dir($this->_root.DS.$folder)) {
- return false;
- }
- return $this->_root.DS.$folder.DS.$name;
- }
- }