joomla_test/libraries/joomla/cache/controller.php
2020-01-02 22:20:31 +07:00

236 lines
4.9 KiB
PHP

<?php
/**
* @package Joomla.Platform
* @subpackage Cache
*
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE
*/
defined('JPATH_PLATFORM') or die;
/**
* Public cache handler
*
* @package Joomla.Platform
* @subpackage Cache
* @since 11.1
*/
class JCacheController
{
/**
* @var JCache
* @since 11.1
*/
public $cache;
/**
* @var array Array of options
* @since 11.1
*/
public $options;
/**
* Constructor
*
* @param array $options Array of options
*
* @since 11.1
*/
public function __construct($options)
{
$this->cache = new JCache($options);
$this->options = & $this->cache->_options;
// Overwrite default options with given options
foreach ($options as $option => $value)
{
if (isset($options[$option]))
{
$this->options[$option] = $options[$option];
}
}
}
/**
* Magic method to proxy JCacheControllerMethods
*
* @param string $name Name of the function
* @param array $arguments Array of arguments for the function
*
* @return mixed
*
* @since 11.1
*/
public function __call($name, $arguments)
{
$nazaj = call_user_func_array(array($this->cache, $name), $arguments);
return $nazaj;
}
/**
* Returns a reference to a cache adapter object, always creating it
*
* @param string $type The cache object type to instantiate; default is output.
* @param array $options Array of options
*
* @return JCache A JCache object
*
* @since 11.1
* @throws RuntimeException
*/
public static function getInstance($type = 'output', $options = array())
{
self::addIncludePath(JPATH_PLATFORM . '/joomla/cache/controller');
$type = strtolower(preg_replace('/[^A-Z0-9_\.-]/i', '', $type));
$class = 'JCacheController' . ucfirst($type);
if (!class_exists($class))
{
// Search for the class file in the JCache include paths.
jimport('joomla.filesystem.path');
if ($path = JPath::find(self::addIncludePath(), strtolower($type) . '.php'))
{
include_once $path;
}
else
{
throw new RuntimeException('Unable to load Cache Controller: ' . $type, 500);
}
}
return new $class($options);
}
/**
* Set caching enabled state
*
* @param boolean $enabled True to enable caching
*
* @return void
*
* @since 11.1
*/
public function setCaching($enabled)
{
$this->cache->setCaching($enabled);
}
/**
* Set cache lifetime
*
* @param integer $lt Cache lifetime
*
* @return void
*
* @since 11.1
*/
public function setLifeTime($lt)
{
$this->cache->setLifeTime($lt);
}
/**
* Add a directory where JCache should search for controllers. You may
* either pass a string or an array of directories.
*
* @param string $path A path to search.
*
* @return array An array with directory elements
*
* @since 11.1
*/
public static function addIncludePath($path = '')
{
static $paths;
if (!isset($paths))
{
$paths = array();
}
if (!empty($path) && !in_array($path, $paths))
{
jimport('joomla.filesystem.path');
array_unshift($paths, JPath::clean($path));
}
return $paths;
}
/**
* Get stored cached data by id and group
*
* @param string $id The cache data id
* @param string $group The cache data group
*
* @return mixed False on no result, cached object otherwise
*
* @since 11.1
*/
public function get($id, $group = null)
{
$data = $this->cache->get($id, $group);
if ($data === false)
{
$locktest = new stdClass;
$locktest->locked = null;
$locktest->locklooped = null;
$locktest = $this->cache->lock($id, $group);
if ($locktest->locked == true && $locktest->locklooped == true)
{
$data = $this->cache->get($id, $group);
}
if ($locktest->locked == true)
{
$this->cache->unlock($id, $group);
}
}
// Check again because we might get it from second attempt
if ($data !== false)
{
// Trim to fix unserialize errors
$data = unserialize(trim($data));
}
return $data;
}
/**
* Store data to cache by id and group
*
* @param mixed $data The data to store
* @param string $id The cache data id
* @param string $group The cache data group
* @param boolean $wrkarounds True to use wrkarounds
*
* @return boolean True if cache stored
*
* @since 11.1
*/
public function store($data, $id, $group = null, $wrkarounds = true)
{
$locktest = new stdClass;
$locktest->locked = null;
$locktest->locklooped = null;
$locktest = $this->cache->lock($id, $group);
if ($locktest->locked == false && $locktest->locklooped == true)
{
$locktest = $this->cache->lock($id, $group);
}
$sucess = $this->cache->store(serialize($data), $id, $group);
if ($locktest->locked == true)
{
$this->cache->unlock($id, $group);
}
return $sucess;
}
}