AAAAPK,>\==file.phpnuW+A_root = $options['cachebase']; } // NOTE: raw php calls are up to 100 times faster than JFile or JFolder /** * Get cached data from a file by id and group * * @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 11.1 */ public function get($id, $group, $checkTime = true) { $data = false; $path = $this->_getFilePath($id, $group); if ($checkTime == false || ($checkTime == true && $this->_checkExpire($id, $group) === true)) { if (file_exists($path)) { $data = file_get_contents($path); if ($data) { // Remove the initial die() statement $data = str_replace('#x#', '', $data); } } return $data; } else { return false; } } /** * Get all cached data * * @return array The cached data * * @since 11.1 */ public function getAll() { parent::getAll(); $path = $this->_root; $folders = $this->_folders($path); $data = array(); foreach ($folders as $folder) { $files = array(); $files = $this->_filesInFolder($path . '/' . $folder); $item = new JCacheStorageHelper($folder); foreach ($files as $file) { $item->updateSize(filesize($path . '/' . $folder . '/' . $file) / 1024); } $data[$folder] = $item; } return $data; } /** * Store the data to a file by id and group * * @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 11.1 */ public function store($id, $group, $data) { $written = false; $path = $this->_getFilePath($id, $group); $die = '#x#'; // Prepend a die string $data = $die . $data; $_fileopen = @fopen($path, "wb"); if ($_fileopen) { $len = strlen($data); @fwrite($_fileopen, $data, $len); $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 * * @param string $id The cache data id * @param string $group The cache data group * * @return boolean True on success, false otherwise * * @since 11.1 */ public function remove($id, $group) { $path = $this->_getFilePath($id, $group); if (!@unlink($path)) { return false; } return true; } /** * Clean cache for a group given a mode. * * @param string $group The cache data group * @param string $mode The mode for cleaning cache [group|notgroup] * group mode : cleans all cache in the group * notgroup mode : cleans all cache not in the group * * @return boolean True on success, false otherwise * * @since 11.1 */ public function clean($group, $mode = null) { $return = true; $folder = $group; if (trim($folder) == '') { $mode = 'notgroup'; } switch ($mode) { case 'notgroup': $folders = $this->_folders($this->_root); for ($i = 0, $n = count($folders); $i < $n; $i++) { if ($folders[$i] != $folder) { $return |= $this->_deleteFolder($this->_root . '/' . $folders[$i]); } } break; case 'group': default: if (is_dir($this->_root . '/' . $folder)) { $return = $this->_deleteFolder($this->_root . '/' . $folder); } break; } return $return; } /** * Garbage collect expired cache data * * @return boolean True on success, false otherwise. * * @since 11.1 */ public function gc() { $result = true; // files older than lifeTime get deleted from cache $files = $this->_filesInFolder($this->_root, '', true, true, array('.svn', 'CVS', '.DS_Store', '__MACOSX', 'index.html')); foreach ($files as $file) { $time = @filemtime($file); if (($time + $this->_lifetime) < $this->_now || empty($time)) { $result |= @unlink($file); } } return $result; } /** * Test to see if the cache storage is available. * * @return boolean True on success, false otherwise. * * @since 11.1 */ public static function test() { $conf = JFactory::getConfig(); return is_writable($conf->get('cache_path', JPATH_CACHE)); } /** * Lock cached item * * @param string $id The cache data id * @param string $group The cache data group * @param integer $locktime Cached item max lock time * * @return boolean True on success, false otherwise. * * @since 11.1 */ public function lock($id, $group, $locktime) { $returning = new stdClass; $returning->locklooped = false; $looptime = $locktime * 10; $path = $this->_getFilePath($id, $group); $_fileopen = @fopen($path, "r+b"); if ($_fileopen) { $data_lock = @flock($_fileopen, LOCK_EX); } else { $data_lock = false; } if ($data_lock === false) { $lock_counter = 0; // loop until you find that the lock has been released. that implies that data get from other thread has finished while ($data_lock === false) { if ($lock_counter > $looptime) { $returning->locked = false; $returning->locklooped = true; break; } usleep(100); $data_lock = @flock($_fileopen, LOCK_EX); $lock_counter++; } } $returning->locked = $data_lock; return $returning; } /** * Unlock cached item * * @param string $id The cache data id * @param string $group The cache data group * * @return boolean True on success, false otherwise. * * @since 11.1 */ public function unlock($id, $group = null) { $path = $this->_getFilePath($id, $group); $_fileopen = @fopen($path, "r+b"); if ($_fileopen) { $ret = @flock($_fileopen, LOCK_UN); @fclose($_fileopen); } return $ret; } /** * Check to make sure cache is still valid, if not, delete it. * * @param string $id Cache key to expire. * @param string $group The cache data group. * * @return boolean False if not valid * * @since 11.1 */ protected function _checkExpire($id, $group) { $path = $this->_getFilePath($id, $group); // check prune period if (file_exists($path)) { $time = @filemtime($path); if (($time + $this->_lifetime) < $this->_now || empty($time)) { @unlink($path); return false; } return true; } return false; } /** * Get a cache file path from an id/group pair * * @param string $id The cache data id * @param string $group The cache data group * * @return string The cache file path * * @since 11.1 */ protected function _getFilePath($id, $group) { $name = $this->_getCacheId($id, $group); $dir = $this->_root . '/' . $group; // If the folder doesn't exist try to create it if (!is_dir($dir)) { // Make sure the index file is there $indexFile = $dir . '/index.html'; @ mkdir($dir) && file_put_contents($indexFile, ''); } // Make sure the folder exists if (!is_dir($dir)) { return false; } return $dir . '/' . $name . '.php'; } /** * Quickly delete a folder of files * * @param string $path The path to the folder to delete. * * @return boolean True on success. * * @since 11.1 */ protected function _deleteFolder($path) { // Sanity check if (!$path || !is_dir($path) || empty($this->_root)) { // Bad programmer! Bad Bad programmer! JError::raiseWarning(500, 'JCacheStorageFile::_deleteFolder ' . JText::_('JLIB_FILESYSTEM_ERROR_DELETE_BASE_DIRECTORY')); return false; } $path = $this->_cleanPath($path); // Check to make sure path is inside cache folder, we do not want to delete Joomla root! $pos = strpos($path, $this->_cleanPath($this->_root)); if ($pos === false || $pos > 0) { JError::raiseWarning(500, 'JCacheStorageFile::_deleteFolder' . JText::sprintf('JLIB_FILESYSTEM_ERROR_PATH_IS_NOT_A_FOLDER', $path)); return false; } // Remove all the files in folder if they exist; disable all filtering $files = $this->_filesInFolder($path, '.', false, true, array(), array()); if (!empty($files) && !is_array($files)) { if (@unlink($files) !== true) { return false; } } elseif (!empty($files) && is_array($files)) { foreach ($files as $file) { $file = $this->_cleanPath($file); // In case of restricted permissions we zap it one way or the other // as long as the owner is either the webserver or the ftp if (@unlink($file)) { // Do nothing } else { $filename = basename($file); JError::raiseWarning('SOME_ERROR_CODE', 'JCacheStorageFile::_deleteFolder' . JText::sprintf('JLIB_FILESYSTEM_DELETE_FAILED', $filename)); return false; } } } // Remove sub-folders of folder; disable all filtering $folders = $this->_folders($path, '.', false, true, array(), array()); foreach ($folders as $folder) { if (is_link($folder)) { // Don't descend into linked directories, just delete the link. if (@unlink($folder) !== true) { return false; } } elseif ($this->_deleteFolder($folder) !== true) { return false; } } // In case of restricted permissions we zap it one way or the other // as long as the owner is either the webserver or the ftp if (@rmdir($path)) { $ret = true; } else { JError::raiseWarning('SOME_ERROR_CODE', 'JCacheStorageFile::_deleteFolder' . JText::sprintf('JLIB_FILESYSTEM_ERROR_FOLDER_DELETE', $path)); $ret = false; } return $ret; } /** * Function to strip additional / or \ in a path name * * @param string $path The path to clean * @param string $ds Directory separator (optional) * * @return string The cleaned path * * @since 11.1 */ protected function _cleanPath($path, $ds = DIRECTORY_SEPARATOR) { $path = trim($path); if (empty($path)) { $path = $this->_root; } else { // Remove double slashes and backslahses and convert all slashes and backslashes to DIRECTORY_SEPARATOR $path = preg_replace('#[/\\\\]+#', $ds, $path); } return $path; } /** * Utility function to quickly read the files in a folder. * * @param string $path The path of the folder to read. * @param string $filter A filter for file names. * @param mixed $recurse True to recursively search into sub-folders, or an * integer to specify the maximum depth. * @param boolean $fullpath True to return the full path to the file. * @param array $exclude Array with names of files which should not be shown in * the result. * @param array $excludefilter Array of folder names to exclude * * @return array Files in the given folder. * * @since 11.1 */ protected function _filesInFolder($path, $filter = '.', $recurse = false, $fullpath = false , $exclude = array('.svn', 'CVS', '.DS_Store', '__MACOSX'), $excludefilter = array('^\..*', '.*~')) { // Initialise variables. $arr = array(); // Check to make sure the path valid and clean $path = $this->_cleanPath($path); // Is the path a folder? if (!is_dir($path)) { JError::raiseWarning(21, 'JCacheStorageFile::_filesInFolder' . JText::sprintf('JLIB_FILESYSTEM_ERROR_PATH_IS_NOT_A_FOLDER', $path)); return false; } // Read the source directory. if (!($handle = @opendir($path))) { return $arr; } if (count($excludefilter)) { $excludefilter = '/(' . implode('|', $excludefilter) . ')/'; } else { $excludefilter = ''; } while (($file = readdir($handle)) !== false) { if (($file != '.') && ($file != '..') && (!in_array($file, $exclude)) && (!$excludefilter || !preg_match($excludefilter, $file))) { $dir = $path . '/' . $file; $isDir = is_dir($dir); if ($isDir) { if ($recurse) { if (is_integer($recurse)) { $arr2 = $this->_filesInFolder($dir, $filter, $recurse - 1, $fullpath); } else { $arr2 = $this->_filesInFolder($dir, $filter, $recurse, $fullpath); } $arr = array_merge($arr, $arr2); } } else { if (preg_match("/$filter/", $file)) { if ($fullpath) { $arr[] = $path . '/' . $file; } else { $arr[] = $file; } } } } } closedir($handle); return $arr; } /** * Utility function to read the folders in a folder. * * @param string $path The path of the folder to read. * @param string $filter A filter for folder names. * @param mixed $recurse True to recursively search into sub-folders, or an integer to specify the maximum depth. * @param boolean $fullpath True to return the full path to the folders. * @param array $exclude Array with names of folders which should not be shown in the result. * @param array $excludefilter Array with regular expressions matching folders which should not be shown in the result. * * @return array Folders in the given folder. * * @since 11.1 */ protected function _folders($path, $filter = '.', $recurse = false, $fullpath = false , $exclude = array('.svn', 'CVS', '.DS_Store', '__MACOSX'), $excludefilter = array('^\..*')) { // Initialise variables. $arr = array(); // Check to make sure the path valid and clean $path = $this->_cleanPath($path); // Is the path a folder? if (!is_dir($path)) { JError::raiseWarning(21, 'JCacheStorageFile::_folders' . JText::sprintf('JLIB_FILESYSTEM_ERROR_PATH_IS_NOT_A_FOLDER', $path)); return false; } // read the source directory if (!($handle = @opendir($path))) { return $arr; } if (count($excludefilter)) { $excludefilter_string = '/(' . implode('|', $excludefilter) . ')/'; } else { $excludefilter_string = ''; } while (($file = readdir($handle)) !== false) { if (($file != '.') && ($file != '..') && (!in_array($file, $exclude)) && (empty($excludefilter_string) || !preg_match($excludefilter_string, $file))) { $dir = $path . '/' . $file; $isDir = is_dir($dir); if ($isDir) { // Removes filtered directories if (preg_match("/$filter/", $file)) { if ($fullpath) { $arr[] = $dir; } else { $arr[] = $file; } } if ($recurse) { if (is_integer($recurse)) { $arr2 = $this->_folders($dir, $filter, $recurse - 1, $fullpath, $exclude, $excludefilter); } else { $arr2 = $this->_folders($dir, $filter, $recurse, $fullpath, $exclude, $excludefilter); } $arr = array_merge($arr, $arr2); } } } } closedir($handle); return $arr; } } PK,>\V index.htmlnuW+A PK,>\) .htaccessnuW+A Order allow,deny Deny from all PK,>\? component.phpnuW+A */ defined('_JEXEC') or die(); /** * Live Update Component Storage Class * Allows to store the update data to a component's parameters. This is the most reliable method. * Its configuration options are: * component string The name of the component which will store our data. If not specified the extension name will be used. * key string The name of the component parameter where the serialized data will be stored. If not specified "liveupdate" will be used. */ class LiveUpdateStorageComponent extends LiveUpdateStorage { private static $component = null; private static $key = null; public function load($config) { if(!array_key_exists('component', $config)) { self::$component = $config['extensionName']; } else { self::$component = $config['component']; } if(!array_key_exists('key', $config)) { self::$key = 'liveupdate'; } else { self::$key = $config['key']; } jimport('joomla.html.parameter'); jimport('joomla.application.component.helper'); $component =& JComponentHelper::getComponent(self::$component); if(!($component->params instanceof JRegistry)) { $params = new JParameter($component->params); } else { $params = $component->params; } $data = $params->getValue(self::$key, ''); jimport('joomla.registry.registry'); self::$registry = new JRegistry('update'); self::$registry->loadINI($data); } public function save() { $data = self::$registry->toString('INI'); $db =JFactory::getDBO(); // An interesting discovery: if your component is manually updating its // component parameters before Live Update is called, then calling Live // Update will reset the modified component parameters because // JComponentHelper::getComponent() returns the old, cached version of // them. So, we have to forget the following code and shoot ourselves in // the feet. Dammit!!! /* jimport('joomla.html.parameter'); jimport('joomla.application.component.helper'); $component =& JComponentHelper::getComponent(self::$component); $params = new JParameter($component->params); $params->setValue(self::$key, $data); */ if( version_compare(JVERSION,'1.6.0','ge') ) { $sql = 'SELECT '.$db->nameQuote('params').' FROM '.$db->nameQuote('#__extensions'). ' WHERE '.$db->nameQuote('type').' = '.$db->Quote('component').' AND '. $db->nameQuote('element').' = '.$db->Quote(self::$component); $db->setQuery($sql); } else { $sql = 'SELECT '.$db->nameQuote('params').' FROM '.$db->nameQuote('#__components'). ' WHERE '.$db->nameQuote('option').' = '.$db->Quote(self::$component). " AND `parent` = 0 AND `menuid` = 0"; $db->setQuery($sql); } $rawparams = $db->loadResult(); $params = new JParameter($rawparams); $params->setValue(self::$key, $data); if( version_compare(JVERSION,'1.6.0','ge') ) { // Joomla! 1.6 $data = $params->toString('JSON'); $sql = 'UPDATE `#__extensions` SET `params` = '.$db->Quote($data).' WHERE '. "`element` = ".$db->Quote(self::$component)." AND `type` = 'component'"; } else { // Joomla! 1.5 $data = $params->toString('INI'); $sql = 'UPDATE `#__components` SET `params` = '.$db->Quote($data).' WHERE '. "`option` = ".$db->Quote(self::$component)." AND `parent` = 0 AND `menuid` = 0"; } $db->setQuery($sql); $db->query(); } } PK,>\ǘ[77 storage.phpnuW+A */ defined('_JEXEC') or die(); /** * Abstract class for the update parameters storage * @author nicholas * */ class LiveUpdateStorage { /** * The update data registry * @var JRegistry */ public static $registry = null; /** * * @param string $type * @param array $config * @return LiveUpdateStorage */ public static function getInstance($type, $config) { static $instances = array(); $sig = md5($type, serialize($config)); if(!array_key_exists($sig, $instances)) { require_once dirname(__FILE__).'/'.strtolower($type).'.php'; $className = 'LiveUpdateStorage'.ucfirst($type); $object = new $className($config); $object->load($config); $newRegistry = clone(self::$registry); $object->setRegistry($newRegistry); $instances[$sig] = $object; } return $instances[$sig]; } public function &getRegistry() { return self::$registry; } public function setRegistry($registry) { self::$registry = $registry; } public final function set($key, $value) { if($key == 'updatedata') { if(function_exists('json_encode') && function_exists('json_decode')) { $value = json_encode($value); } elseif(function_exists('base64_encode') && function_exists('base64_decode')) { $value = base64_encode(serialize($value)); } else { $value = serialize($value); } } self::$registry->setValue("update.$key", $value); } public final function get($key, $default) { $value = self::$registry->getValue("update.$key", $default); if($key == 'updatedata') { if(function_exists('json_encode') && function_exists('json_decode')) { $value = json_decode($value); } elseif(function_exists('base64_encode') && function_exists('base64_decode')) { $value = unserialize(base64_decode($value)); } else { $value = unserialize($value); } } return $value; } public function save() {} public function load($config) {} }PKO?\;Z?? xcache.phpnuW+A_getCacheId($id, $group); $cache_content = xcache_get($cache_id); if ($cache_content === null) { return false; } return $cache_content; } /** * Get all cached data * * This requires the php.ini setting xcache.admin.enable_auth = Off. * * @return array data * * @since 11.1 */ public function getAll() { parent::getAll(); $allinfo = xcache_list(XC_TYPE_VAR, 0); $keys = $allinfo['cache_list']; $secret = $this->_hash; $data = array(); foreach ($keys as $key) { $namearr = explode('-', $key['name']); if ($namearr !== false && $namearr[0] == $secret && $namearr[1] == 'cache') { $group = $namearr[2]; if (!isset($data[$group])) { $item = new JCacheStorageHelper($group); } else { $item = $data[$group]; } $item->updateSize($key['size'] / 1024); $data[$group] = $item; } } return $data; } /** * Store the data by id and group * * @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 11.1 */ public function store($id, $group, $data) { $cache_id = $this->_getCacheId($id, $group); $store = xcache_set($cache_id, $data, $this->_lifetime); return $store; } /** * Remove a cached data entry by id and group * * @param string $id The cache data id * @param string $group The cache data group * * @return boolean True on success, false otherwise * * @since 11.1 */ public function remove($id, $group) { $cache_id = $this->_getCacheId($id, $group); if (!xcache_isset($cache_id)) { return true; } return xcache_unset($cache_id); } /** * Clean cache for a group given a mode. * * This requires the php.ini setting xcache.admin.enable_auth = Off. * * @param string $group The cache data group * @param string $mode The mode for cleaning cache [group|notgroup] * group mode : cleans all cache in the group * notgroup mode : cleans all cache not in the group * * @return boolean True on success, false otherwise * * @since 11.1 */ public function clean($group, $mode = null) { $allinfo = xcache_list(XC_TYPE_VAR, 0); $keys = $allinfo['cache_list']; $secret = $this->_hash; foreach ($keys as $key) { if (strpos($key['name'], $secret . '-cache-' . $group . '-') === 0 xor $mode != 'group') { xcache_unset($key['name']); } } return true; } /** * Garbage collect expired cache data * * This is a dummy, since xcache has built in garbage collector, turn it * on in php.ini by changing default xcache.gc_interval setting from * 0 to 3600 (=1 hour) * * @return boolean True on success, false otherwise. * * @since 11.1 */ public function gc() { /* $now = time(); $cachecount = xcache_count(XC_TYPE_VAR); for ($i = 0; $i < $cachecount; $i ++) { $allinfo = xcache_list(XC_TYPE_VAR, $i); $keys = $allinfo ['cache_list']; foreach($keys as $key) { if (strstr($key['name'], $this->_hash)) { if (($key['ctime'] + $this->_lifetime ) < $this->_now) xcache_unset($key['name']); } } } */ return true; } /** * Test to see if the cache storage is available. * * @return boolean True on success, false otherwise. * * @since 11.1 */ public static function test() { return (extension_loaded('xcache')); } } PKO?\А- database.phpnuW+Aconnected()) { return false; } try { // Get the session data from the database table. $query = $db->getQuery(true); $query->select($db->quoteName('data')) ->from($db->quoteName('#__session')) ->where($db->quoteName('session_id') . ' = ' . $db->quote($id)); $db->setQuery($query); return (string) $db->loadResult(); } catch (Exception $e) { return false; } } /** * Write session data to the SessionHandler backend. * * @param string $id The session identifier. * @param string $data The session data. * * @return boolean True on success, false otherwise. * * @since 11.1 */ public function write($id, $data) { // Get the database connection object and verify its connected. $db = JFactory::getDbo(); if (!$db->connected()) { return false; } try { $query = $db->getQuery(true); $query->update($db->quoteName('#__session')) ->set($db->quoteName('data') . ' = ' . $db->quote($data)) ->set($db->quoteName('time') . ' = ' . $db->quote((int) time())) ->where($db->quoteName('session_id') . ' = ' . $db->quote($id)); // Try to update the session data in the database table. $db->setQuery($query); if (!$db->execute()) { return false; } /* Since $db->execute did not throw an exception, so the query was successful. Either the data changed, or the data was identical. In either case we are done. */ return true; } catch (Exception $e) { return false; } } /** * Destroy the data for a particular session identifier in the SessionHandler backend. * * @param string $id The session identifier. * * @return boolean True on success, false otherwise. * * @since 11.1 */ public function destroy($id) { // Get the database connection object and verify its connected. $db = JFactory::getDbo(); if (!$db->connected()) { return false; } try { $query = $db->getQuery(true); $query->delete($db->quoteName('#__session')) ->where($db->quoteName('session_id') . ' = ' . $db->quote($id)); // Remove a session from the database. $db->setQuery($query); return (boolean) $db->execute(); } catch (Exception $e) { return false; } } /** * Garbage collect stale sessions from the SessionHandler backend. * * @param integer $lifetime The maximum age of a session. * * @return boolean True on success, false otherwise. * * @since 11.1 */ public function gc($lifetime = 1440) { // Get the database connection object and verify its connected. $db = JFactory::getDbo(); if (!$db->connected()) { return false; } // Determine the timestamp threshold with which to purge old sessions. $past = time() - $lifetime; try { $query = $db->getQuery(true); $query->delete($db->quoteName('#__session')) ->where($db->quoteName('time') . ' < ' . $db->quote((int) $past)); // Remove expired sessions from the database. $db->setQuery($query); return (boolean) $db->execute(); } catch (Exception $e) { return false; } } } PKO?\ipnone.phpnuW+A_getCacheId($id, $group); return apc_fetch($cache_id); } /** * Get all cached data * * @return array data * * @since 11.1 */ public function getAll() { parent::getAll(); $allinfo = apc_cache_info('user'); $keys = $allinfo['cache_list']; $secret = $this->_hash; $data = array(); foreach ($keys as $key) { $name = $key['info']; $namearr = explode('-', $name); if ($namearr !== false && $namearr[0] == $secret && $namearr[1] == 'cache') { $group = $namearr[2]; if (!isset($data[$group])) { $item = new JCacheStorageHelper($group); } else { $item = $data[$group]; } $item->updateSize($key['mem_size'] / 1024); $data[$group] = $item; } } return $data; } /** * Store the data to APC by id and group * * @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 11.1 */ public function store($id, $group, $data) { $cache_id = $this->_getCacheId($id, $group); return apc_store($cache_id, $data, $this->_lifetime); } /** * Remove a cached data entry by id and group * * @param string $id The cache data id * @param string $group The cache data group * * @return boolean True on success, false otherwise * * @since 11.1 */ public function remove($id, $group) { $cache_id = $this->_getCacheId($id, $group); return apc_delete($cache_id); } /** * 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 * * @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 11.1 */ public function clean($group, $mode = null) { $allinfo = apc_cache_info('user'); $keys = $allinfo['cache_list']; $secret = $this->_hash; foreach ($keys as $key) { if (strpos($key['info'], $secret . '-cache-' . $group . '-') === 0 xor $mode != 'group') { apc_delete($key['info']); } } return true; } /** * Force garbage collect expired cache data as items are removed only on fetch! * * @return boolean True on success, false otherwise. * * @since 11.1 */ public function gc() { $allinfo = apc_cache_info('user'); $keys = $allinfo['cache_list']; $secret = $this->_hash; foreach ($keys as $key) { if (strpos($key['info'], $secret . '-cache-')) { apc_fetch($key['info']); } } } /** * Test to see if the cache storage is available. * * @return boolean True on success, false otherwise. * * @since 11.1 */ public static function test() { return extension_loaded('apc'); } /** * Lock cached item - override parent as this is more efficient * * @param string $id The cache data id * @param string $group The cache data group * @param integer $locktime Cached item max lock time * * @return object Properties are lock and locklooped * * @since 11.1 */ public function lock($id, $group, $locktime) { $returning = new stdClass; $returning->locklooped = false; $looptime = $locktime * 10; $cache_id = $this->_getCacheId($id, $group) . '_lock'; $data_lock = apc_add($cache_id, 1, $locktime); if ($data_lock === false) { $lock_counter = 0; // loop until you find that the lock has been released. that implies that data get from other thread has finished while ($data_lock === false) { if ($lock_counter > $looptime) { $returning->locked = false; $returning->locklooped = true; break; } usleep(100); $data_lock = apc_add($cache_id, 1, $locktime); $lock_counter++; } } $returning->locked = $data_lock; return $returning; } /** * Unlock cached item - override parent for cacheid compatibility with lock * * @param string $id The cache data id * @param string $group The cache data group * * @return boolean True on success, false otherwise. * * @since 11.1 */ public function unlock($id, $group = null) { $unlock = false; $cache_id = $this->_getCacheId($id, $group) . '_lock'; $unlock = apc_delete($cache_id); return $unlock; } } PKO?\["" wincache.phpnuW+A_getCacheId($id, $group); $cache_content = wincache_ucache_get($cache_id); return $cache_content; } /** * Get all cached data * * @return array data * * @since 11.1 */ public function getAll() { parent::getAll(); $allinfo = wincache_ucache_info(); $keys = $allinfo['cache_entries']; $secret = $this->_hash; $data = array(); foreach ($keys as $key) { $name = $key['key_name']; $namearr = explode('-', $name); if ($namearr !== false && $namearr[0] == $secret && $namearr[1] == 'cache') { $group = $namearr[2]; if (!isset($data[$group])) { $item = new JCacheStorageHelper($group); } else { $item = $data[$group]; } if (isset($key['value_size'])) { $item->updateSize($key['value_size'] / 1024); } else { // Dummy, WINCACHE version is too low. $item->updateSize(1); } $data[$group] = $item; } } return $data; } /** * Store the data to WINCACHE by id and group * * @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 11.1 */ public function store($id, $group, $data) { $cache_id = $this->_getCacheId($id, $group); return wincache_ucache_set($cache_id, $data, $this->_lifetime); } /** * Remove a cached data entry by id and group * * @param string $id The cache data id * @param string $group The cache data group * * @return boolean True on success, false otherwise * * @since 11.1 */ public function remove($id, $group) { $cache_id = $this->_getCacheId($id, $group); return wincache_ucache_delete($cache_id); } /** * Clean cache for a group given a mode. * * @param string $group The cache data group * @param string $mode The mode for cleaning cache [group|notgroup] * group mode : cleans all cache in the group * notgroup mode : cleans all cache not in the group * * @return boolean True on success, false otherwise * * @since 11.1 */ public function clean($group, $mode = null) { $allinfo = wincache_ucache_info(); $keys = $allinfo['cache_entries']; $secret = $this->_hash; foreach ($keys as $key) { if (strpos($key['key_name'], $secret . '-cache-' . $group . '-') === 0 xor $mode != 'group') { wincache_ucache_delete($key['key_name']); } } return true; } /** * Force garbage collect expired cache data as items are removed only on get/add/delete/info etc * * @return boolean True on success, false otherwise. * * @since 11.1 */ public function gc() { $allinfo = wincache_ucache_info(); $keys = $allinfo['cache_entries']; $secret = $this->_hash; foreach ($keys as $key) { if (strpos($key['key_name'], $secret . '-cache-')) { wincache_ucache_get($key['key_name']); } } } /** * Test to see if the cache storage is available. * * @return boolean True on success, false otherwise. */ public static function test() { $test = extension_loaded('wincache') && function_exists('wincache_ucache_get') && !strcmp(ini_get('wincache.ucenabled'), '1'); return $test; } } PKO?\ _'_' memcached.phpnuW+AgetConnection(); } } /** * Return memcached connection object * * @return object memcached connection object * * @since 12.1 */ protected function getConnection() { if ((extension_loaded('memcached') && class_exists('Memcached')) != true) { return false; } $config = JFactory::getConfig(); $this->_persistent = $config->get('memcache_persist', true); $this->_compress = $config->get('memcache_compress', false) == false ? 0 : Memcached::OPT_COMPRESSION; /* * This will be an array of loveliness * @todo: multiple servers * $servers = (isset($params['servers'])) ? $params['servers'] : array(); */ $server = array(); $server['host'] = $config->get('memcache_server_host', 'localhost'); $server['port'] = $config->get('memcache_server_port', 11211); // Create the memcache connection if ($this->_persistent) { $session = JFactory::getSession(); self::$_db = new Memcached($session->getId()); } else { self::$_db = new Memcached; } $memcachedtest = self::$_db->addServer($server['host'], $server['port']); if ($memcachedtest == false) { return JError::raiseError(404, "Could not connect to memcached server"); } self::$_db->setOption(Memcached::OPT_COMPRESSION, $this->_compress); // Memcached has no list keys, we do our own accounting, initialise key index if (self::$_db->get($this->_hash . '-index') === false) { $empty = array(); self::$_db->set($this->_hash . '-index', $empty, 0); } return; } /** * Get cached data from memcached by id and group * * @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 12.1 */ public function get($id, $group, $checkTime = true) { $cache_id = $this->_getCacheId($id, $group); $back = self::$_db->get($cache_id); return $back; } /** * Get all cached data * * @return array data * * @since 12.1 */ public function getAll() { parent::getAll(); $keys = self::$_db->get($this->_hash . '-index'); $secret = $this->_hash; $data = array(); if (!empty($keys) && is_array($keys)) { foreach ($keys as $key) { if (empty($key)) { continue; } $namearr = explode('-', $key->name); if ($namearr !== false && $namearr[0] == $secret && $namearr[1] == 'cache') { $group = $namearr[2]; if (!isset($data[$group])) { $item = new JCacheStorageHelper($group); } else { $item = $data[$group]; } $item->updateSize($key->size / 1024); $data[$group] = $item; } } } return $data; } /** * Store the data to memcached by id and group * * @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 12.1 */ public function store($id, $group, $data) { $cache_id = $this->_getCacheId($id, $group); if (!$this->lockindex()) { return false; } $index = self::$_db->get($this->_hash . '-index'); if ($index === false) { $index = array(); } $tmparr = new stdClass; $tmparr->name = $cache_id; $tmparr->size = strlen($data); $index[] = $tmparr; self::$_db->replace($this->_hash . '-index', $index, 0); $this->unlockindex(); // Prevent double writes, write only if it doesn't exist else replace if (!self::$_db->replace($cache_id, $data, $this->_lifetime)) { self::$_db->set($cache_id, $data, $this->_lifetime); } return true; } /** * Remove a cached data entry by id and group * * @param string $id The cache data id * @param string $group The cache data group * * @return boolean True on success, false otherwise * * @since 12.1 */ public function remove($id, $group) { $cache_id = $this->_getCacheId($id, $group); if (!$this->lockindex()) { return false; } $index = self::$_db->get($this->_hash . '-index'); if ($index === false) { $index = array(); } foreach ($index as $key => $value) { if ($value->name == $cache_id) { unset($index[$key]); } break; } self::$_db->replace($this->_hash . '-index', $index, 0); $this->unlockindex(); return self::$_db->delete($cache_id); } /** * Clean cache for a group given a mode. * * @param string $group The cache data group * @param string $mode The mode for cleaning cache [group|notgroup] * group mode : cleans all cache in the group * notgroup mode : cleans all cache not in the group * * @return boolean True on success, false otherwise * * @since 12.1 */ public function clean($group, $mode = null) { if (!$this->lockindex()) { return false; } $index = self::$_db->get($this->_hash . '-index'); if ($index === false) { $index = array(); } $secret = $this->_hash; foreach ($index as $key => $value) { if (strpos($value->name, $secret . '-cache-' . $group . '-') === 0 xor $mode != 'group') { self::$_db->delete($value->name, 0); unset($index[$key]); } } self::$_db->replace($this->_hash . '-index', $index, 0); $this->unlockindex(); return true; } /** * Test to see if the cache storage is available. * * @return boolean True on success, false otherwise. */ public static function test() { if ((extension_loaded('memcached') && class_exists('Memcached')) != true) { return false; } $config = JFactory::getConfig(); $host = $config->get('memcache_server_host', 'localhost'); $port = $config->get('memcache_server_port', 11211); $memcached = new Memcached; $memcachedtest = @$memcached->addServer($host, $port); if (!$memcachedtest) { return false; } else { return true; } } /** * Lock cached item - override parent as this is more efficient * * @param string $id The cache data id * @param string $group The cache data group * @param integer $locktime Cached item max lock time * * @return boolean True on success, false otherwise. * * @since 12.1 */ public function lock($id, $group, $locktime) { $returning = new stdClass; $returning->locklooped = false; $looptime = $locktime * 10; $cache_id = $this->_getCacheId($id, $group); if (!$this->lockindex()) { return false; } $index = self::$_db->get($this->_hash . '-index'); if ($index === false) { $index = array(); } $tmparr = new stdClass; $tmparr->name = $cache_id; $tmparr->size = 1; $index[] = $tmparr; self::$_db->replace($this->_hash . '-index', $index, 0); $this->unlockindex(); $data_lock = self::$_db->add($cache_id . '_lock', 1, $locktime); if ($data_lock === false) { $lock_counter = 0; // Loop until you find that the lock has been released. // That implies that data get from other thread has finished while ($data_lock === false) { if ($lock_counter > $looptime) { $returning->locked = false; $returning->locklooped = true; break; } usleep(100); $data_lock = self::$_db->add($cache_id . '_lock', 1, $locktime); $lock_counter++; } } $returning->locked = $data_lock; return $returning; } /** * Unlock cached item - override parent for cacheid compatibility with lock * * @param string $id The cache data id * @param string $group The cache data group * * @return boolean True on success, false otherwise. * * @since 12.1 */ public function unlock($id, $group = null) { $cache_id = $this->_getCacheId($id, $group) . '_lock'; if (!$this->lockindex()) { return false; } $index = self::$_db->get($this->_hash . '-index'); if ($index === false) { $index = array(); } foreach ($index as $key => $value) { if ($value->name == $cache_id) { unset($index[$key]); } break; } self::$_db->replace($this->_hash . '-index', $index, 0); $this->unlockindex(); return self::$_db->delete($cache_id); } /** * Lock cache index * * @return boolean True on success, false otherwise. * * @since 12.1 */ protected function lockindex() { $looptime = 300; $data_lock = self::$_db->add($this->_hash . '-index_lock', 1, 30); if ($data_lock === false) { $lock_counter = 0; // Loop until you find that the lock has been released. that implies that data get from other thread has finished while ($data_lock === false) { if ($lock_counter > $looptime) { return false; break; } usleep(100); $data_lock = self::$_db->add($this->_hash . '-index_lock', 1, 30); $lock_counter++; } } return true; } /** * Unlock cache index * * @return boolean True on success, false otherwise. * * @since 12.1 */ protected function unlockindex() { return self::$_db->delete($this->_hash . '-index_lock'); } } PKO?\FF'' memcache.phpnuW+AgetConnection(); } } /** * Return memcache connection object * * @return object memcache connection object * * @since 11.1 */ protected function getConnection() { if ((extension_loaded('memcache') && class_exists('Memcache')) != true) { return false; } $config = JFactory::getConfig(); $this->_persistent = $config->get('memcache_persist', true); $this->_compress = $config->get('memcache_compress', false) == false ? 0 : MEMCACHE_COMPRESSED; // This will be an array of loveliness // @todo: multiple servers //$servers = (isset($params['servers'])) ? $params['servers'] : array(); $server = array(); $server['host'] = $config->get('memcache_server_host', 'localhost'); $server['port'] = $config->get('memcache_server_port', 11211); // Create the memcache connection self::$_db = new Memcache; self::$_db->addServer($server['host'], $server['port'], $this->_persistent); $memcachetest = @self::$_db->connect($server['host'], $server['port']); if ($memcachetest == false) { return JError::raiseError(404, "Could not connect to memcache server"); } // Memcahed has no list keys, we do our own accounting, initialise key index if (self::$_db->get($this->_hash . '-index') === false) { $empty = array(); self::$_db->set($this->_hash . '-index', $empty, $this->_compress, 0); } return; } /** * Get cached data from memcache by id and group * * @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 11.1 */ public function get($id, $group, $checkTime = true) { $cache_id = $this->_getCacheId($id, $group); $back = self::$_db->get($cache_id); return $back; } /** * Get all cached data * * @return array data * * @since 11.1 */ public function getAll() { parent::getAll(); $keys = self::$_db->get($this->_hash . '-index'); $secret = $this->_hash; $data = array(); if (!empty($keys)) { foreach ($keys as $key) { if (empty($key)) { continue; } $namearr = explode('-', $key->name); if ($namearr !== false && $namearr[0] == $secret && $namearr[1] == 'cache') { $group = $namearr[2]; if (!isset($data[$group])) { $item = new JCacheStorageHelper($group); } else { $item = $data[$group]; } $item->updateSize($key->size / 1024); $data[$group] = $item; } } } return $data; } /** * Store the data to memcache by id and group * * @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 11.1 */ public function store($id, $group, $data) { $cache_id = $this->_getCacheId($id, $group); if (!$this->lockindex()) { return false; } $index = self::$_db->get($this->_hash . '-index'); if ($index === false) { $index = array(); } $tmparr = new stdClass; $tmparr->name = $cache_id; $tmparr->size = strlen($data); $index[] = $tmparr; self::$_db->replace($this->_hash . '-index', $index, 0, 0); $this->unlockindex(); $config = JFactory::getConfig(); $lifetime = (int) $config->get('cachetime', 15); if ($this->_lifetime == $lifetime) { $this->_lifetime = $lifetime * 60; } // prevent double writes, write only if it doesn't exist else replace if (!self::$_db->replace($cache_id, $data, $this->_compress, $this->_lifetime)) { self::$_db->set($cache_id, $data, $this->_compress, $this->_lifetime); } return true; } /** * Remove a cached data entry by id and group * * @param string $id The cache data id * @param string $group The cache data group * * @return boolean True on success, false otherwise * * @since 11.1 */ public function remove($id, $group) { $cache_id = $this->_getCacheId($id, $group); if (!$this->lockindex()) { return false; } $index = self::$_db->get($this->_hash . '-index'); if ($index === false) { $index = array(); } foreach ($index as $key => $value) { if ($value->name == $cache_id) { unset($index[$key]); } break; } self::$_db->replace($this->_hash . '-index', $index, 0, 0); $this->unlockindex(); return self::$_db->delete($cache_id); } /** * Clean cache for a group given a mode. * * @param string $group The cache data group * @param string $mode The mode for cleaning cache [group|notgroup] * group mode : cleans all cache in the group * notgroup mode : cleans all cache not in the group * * @return boolean True on success, false otherwise * * @since 11.1 */ public function clean($group, $mode = null) { if (!$this->lockindex()) { return false; } $index = self::$_db->get($this->_hash . '-index'); if ($index === false) { $index = array(); } $secret = $this->_hash; foreach ($index as $key => $value) { if (strpos($value->name, $secret . '-cache-' . $group . '-') === 0 xor $mode != 'group') { self::$_db->delete($value->name, 0); unset($index[$key]); } } self::$_db->replace($this->_hash . '-index', $index, 0, 0); $this->unlockindex(); return true; } /** * Test to see if the cache storage is available. * * @return boolean True on success, false otherwise. */ public static function test() { if ((extension_loaded('memcache') && class_exists('Memcache')) != true) { return false; } $config = JFactory::getConfig(); $host = $config->get('memcache_server_host', 'localhost'); $port = $config->get('memcache_server_port', 11211); $memcache = new Memcache; $memcachetest = @$memcache->connect($host, $port); if (!$memcachetest) { return false; } else { return true; } } /** * Lock cached item - override parent as this is more efficient * * @param string $id The cache data id * @param string $group The cache data group * @param integer $locktime Cached item max lock time * * @return boolean True on success, false otherwise. * * @since 11.1 */ public function lock($id, $group, $locktime) { $returning = new stdClass; $returning->locklooped = false; $looptime = $locktime * 10; $cache_id = $this->_getCacheId($id, $group); if (!$this->lockindex()) { return false; } $index = self::$_db->get($this->_hash . '-index'); if ($index === false) { $index = array(); } $tmparr = new stdClass; $tmparr->name = $cache_id; $tmparr->size = 1; $index[] = $tmparr; self::$_db->replace($this->_hash . '-index', $index, 0, 0); $this->unlockindex(); $data_lock = self::$_db->add($cache_id . '_lock', 1, false, $locktime); if ($data_lock === false) { $lock_counter = 0; // Loop until you find that the lock has been released. // That implies that data get from other thread has finished while ($data_lock === false) { if ($lock_counter > $looptime) { $returning->locked = false; $returning->locklooped = true; break; } usleep(100); $data_lock = self::$_db->add($cache_id . '_lock', 1, false, $locktime); $lock_counter++; } } $returning->locked = $data_lock; return $returning; } /** * Unlock cached item - override parent for cacheid compatibility with lock * * @param string $id The cache data id * @param string $group The cache data group * * @return boolean True on success, false otherwise. * * @since 11.1 */ public function unlock($id, $group = null) { $cache_id = $this->_getCacheId($id, $group) . '_lock'; if (!$this->lockindex()) { return false; } $index = self::$_db->get($this->_hash . '-index'); if ($index === false) { $index = array(); } foreach ($index as $key => $value) { if ($value->name == $cache_id) { unset($index[$key]); } break; } self::$_db->replace($this->_hash . '-index', $index, 0, 0); $this->unlockindex(); return self::$_db->delete($cache_id); } /** * Lock cache index * * @return boolean True on success, false otherwise. * * @since 11.1 */ protected function lockindex() { $looptime = 300; $data_lock = self::$_db->add($this->_hash . '-index_lock', 1, false, 30); if ($data_lock === false) { $lock_counter = 0; // Loop until you find that the lock has been released. that implies that data get from other thread has finished while ($data_lock === false) { if ($lock_counter > $looptime) { return false; break; } usleep(100); $data_lock = self::$_db->add($this->_hash . '-index_lock', 1, false, 30); $lock_counter++; } } return true; } /** * Unlock cache index * * @return boolean True on success, false otherwise. * * @since 11.1 */ protected function unlockindex() { return self::$_db->delete($this->_hash . '-index_lock'); } } PKO?\.>eaccelerator.phpnuW+A_getCacheId($id, $group); $cache_content = eaccelerator_get($cache_id); if ($cache_content === null) { return false; } return $cache_content; } /** * Get all cached data * * @return array data * * @since 11.1 */ public function getAll() { parent::getAll(); $keys = eaccelerator_list_keys(); $secret = $this->_hash; $data = array(); foreach ($keys as $key) { /* Trim leading ":" to work around list_keys namespace bug in eAcc. This will still work when bug is fixed */ // http://eaccelerator.net/ticket/287 $name = ltrim($key['name'], ':'); $namearr = explode('-', $name); if ($namearr !== false && $namearr[0] == $secret && $namearr[1] == 'cache') { $group = $namearr[2]; if (!isset($data[$group])) { $item = new JCacheStorageHelper($group); } else { $item = $data[$group]; } $item->updateSize($key['size'] / 1024); $data[$group] = $item; } } return $data; } /** * Store the data to by id and group * * @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 11.1 */ public function store($id, $group, $data) { $cache_id = $this->_getCacheId($id, $group); return eaccelerator_put($cache_id, $data, $this->_lifetime); } /** * Remove a cached data entry by id and group * * @param string $id The cache data id * @param string $group The cache data group * * @return boolean True on success, false otherwise * * @since 11.1 */ public function remove($id, $group) { $cache_id = $this->_getCacheId($id, $group); return eaccelerator_rm($cache_id); } /** * Clean cache for a group given a mode. * * @param string $group The cache data group * @param string $mode The mode for cleaning cache [group|notgroup] * group mode : cleans all cache in the group * notgroup mode : cleans all cache not in the group * * @return boolean True on success, false otherwise * * @since 11.1 */ public function clean($group, $mode = null) { $keys = eaccelerator_list_keys(); $secret = $this->_hash; if (is_array($keys)) { foreach ($keys as $key) { /* Trim leading ":" to work around list_keys namespace bug in eAcc. This will still work when bug is fixed */ $key['name'] = ltrim($key['name'], ':'); if (strpos($key['name'], $secret . '-cache-' . $group . '-') === 0 xor $mode != 'group') { eaccelerator_rm($key['name']); } } } return true; } /** * Garbage collect expired cache data * * @return boolean True on success, false otherwise. * * @since 11.1 */ public function gc() { return eaccelerator_gc(); } /** * Test to see if the cache storage is available. * * @return boolean True on success, false otherwise. * * @since 11.1 */ public static function test() { return (extension_loaded('eaccelerator') && function_exists('eaccelerator_get')); } /** * Lock cached item * * @param string $id The cache data id * @param string $group The cache data group * @param integer $locktime Cached item max lock time * * @return boolean True on success, false otherwise. * * @since 11.1 */ public function lock($id, $group, $locktime) { $returning = new stdClass; $returning->locklooped = false; $looptime = $locktime * 10; $cache_id = $this->_getCacheId($id, $group); $data_lock = eaccelerator_lock($cache_id); if ($data_lock === false) { $lock_counter = 0; // Loop until you find that the lock has been released. // That implies that data get from other thread has finished while ($data_lock === false) { if ($lock_counter > $looptime) { $returning->locked = false; $returning->locklooped = true; break; } usleep(100); $data_lock = eaccelerator_lock($cache_id); $lock_counter++; } } $returning->locked = $data_lock; return $returning; } /** * Unlock cached item * * @param string $id The cache data id * @param string $group The cache data group * * @return boolean True on success, false otherwise. * * @since 11.1 */ public function unlock($id, $group = null) { $cache_id = $this->_getCacheId($id, $group); return eaccelerator_unlock($cache_id); } } PK|?\ #= cachelite.phpnuW+A_root = $options['cachebase']; $cloptions = array( 'cacheDir' => $this->_root . '/', 'lifeTime' => $this->_lifetime, 'fileLocking' => $this->_locking, 'automaticCleaningFactor' => isset($options['autoclean']) ? $options['autoclean'] : 200, 'fileNameProtection' => false, 'hashedDirectoryLevel' => 0, 'caching' => $options['caching']); if (self::$CacheLiteInstance === null) { $this->initCache($cloptions); } } /** * Instantiates the appropriate CacheLite object. * Only initializes the engine if it does not already exist. * Note this is a protected method * * @param array $cloptions optional parameters * * @return object * * @since 11.1 */ protected function initCache($cloptions) { require_once 'Cache/Lite.php'; self::$CacheLiteInstance = new Cache_Lite($cloptions); return self::$CacheLiteInstance; } /** * Get cached data from a file by id and group * * @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 11.1 */ public function get($id, $group, $checkTime = true) { $data = false; self::$CacheLiteInstance->setOption('cacheDir', $this->_root . '/' . $group . '/'); $this->_getCacheId($id, $group); $data = self::$CacheLiteInstance->get($this->rawname, $group); return $data; } /** * Get all cached data * * @return array * * @since 11.1 */ public function getAll() { parent::getAll(); $path = $this->_root; jimport('joomla.filesystem.folder'); $folders = JFolder::folders($path); $data = array(); foreach ($folders as $folder) { $files = JFolder::files($path . '/' . $folder); $item = new JCacheStorageHelper($folder); foreach ($files as $file) { $item->updateSize(filesize($path . '/' . $folder . '/' . $file) / 1024); } $data[$folder] = $item; } return $data; } /** * Store the data to a file by id and group * * @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 11.1 */ public function store($id, $group, $data) { $dir = $this->_root . '/' . $group; // If the folder doesn't exist try to create it if (!is_dir($dir)) { // Make sure the index file is there $indexFile = $dir . '/index.html'; @mkdir($dir) && file_put_contents($indexFile, ''); } // Make sure the folder exists if (!is_dir($dir)) { return false; } self::$CacheLiteInstance->setOption('cacheDir', $this->_root . '/' . $group . '/'); $this->_getCacheId($id, $group); $success = self::$CacheLiteInstance->save($data, $this->rawname, $group); if ($success == true) { return $success; } else { return false; } } /** * Remove a cached data file by id and group * * @param string $id The cache data id * @param string $group The cache data group * * @return boolean True on success, false otherwise * * @since 11.1 */ public function remove($id, $group) { self::$CacheLiteInstance->setOption('cacheDir', $this->_root . '/' . $group . '/'); $this->_getCacheId($id, $group); $success = self::$CacheLiteInstance->remove($this->rawname, $group); if ($success == true) { return $success; } else { return false; } } /** * Clean cache for a group given a mode. * * @param string $group The cache data group. * @param string $mode The mode for cleaning cache [group|notgroup]. * group mode : cleans all cache in the group * notgroup mode : cleans all cache not in the group * * @return boolean True on success, false otherwise. * * @since 11.1 */ public function clean($group, $mode = null) { jimport('joomla.filesystem.folder'); if (trim($group) == '') { $clmode = 'notgroup'; } if ($mode == null) { $clmode = 'group'; } switch ($mode) { case 'notgroup': $clmode = 'notingroup'; $success = self::$CacheLiteInstance->clean($group, $clmode); break; case 'group': if (is_dir($this->_root . '/' . $group)) { $clmode = $group; self::$CacheLiteInstance->setOption('cacheDir', $this->_root . '/' . $group . '/'); $success = self::$CacheLiteInstance->clean($group, $clmode); JFolder::delete($this->_root . '/' . $group); } else { $success = true; } break; default: if (is_dir($this->_root . '/' . $group)) { $clmode = $group; self::$CacheLiteInstance->setOption('cacheDir', $this->_root . '/' . $group . '/'); $success = self::$CacheLiteInstance->clean($group, $clmode); } else { $success = true; } break; } if ($success == true) { return $success; } else { return false; } } /** * Garbage collect expired cache data * * @return boolean True on success, false otherwise. * * @since 11.1 */ public function gc() { $result = true; self::$CacheLiteInstance->setOption('automaticCleaningFactor', 1); self::$CacheLiteInstance->setOption('hashedDirectoryLevel', 1); $success1 = self::$CacheLiteInstance->_cleanDir($this->_root . '/', false, 'old'); if (!($dh = opendir($this->_root . '/'))) { return false; } while ($file = readdir($dh)) { if (($file != '.') && ($file != '..') && ($file != '.svn')) { $file2 = $this->_root . '/' . $file; if (is_dir($file2)) { $result = ($result and (self::$CacheLiteInstance->_cleanDir($file2 . '/', false, 'old'))); } } } $success = ($success1 && $result); return $success; } /** * Test to see if the cache storage is available. * * @return boolean True on success, false otherwise. * * @since 11.1 */ public static function test() { @include_once 'Cache/Lite.php'; if (class_exists('Cache_Lite')) { return true; } else { return false; } } } PK|?\)helpers/.htaccessnuW+A Order allow,deny Deny from all PK|?\ۦ__helpers/helper.phpnuW+Agroup = $group; } /** * Increase cache items count. * * @param string $size Cached item size * * @return void * * @since 11.1 */ public function updateSize($size) { $this->size = number_format($this->size + $size, 2, '.', ''); $this->count++; } } PK|?\Vhelpers/index.htmlnuW+A PK,>\==file.phpnuW+APK,>\V 0>index.htmlnuW+APK,>\) >.htaccessnuW+APK,>\? A?component.phpnuW+APK,>\ǘ[77 CMstorage.phpnuW+APKO?\;Z?? Uxcache.phpnuW+APKO?\А- .gdatabase.phpnuW+APKO?\ipvnone.phpnuW+APKO?\Szapc.phpnuW+APKO?\["" pwincache.phpnuW+APKO?\ _'_' Πmemcached.phpnuW+APKO?\FF'' jmemcache.phpnuW+APKO?\.>Jeaccelerator.phpnuW+APK|?\ #= _cachelite.phpnuW+APK|?\)"helpers/.htaccessnuW+APK|?\ۦ__"helpers/helper.phpnuW+APK|?\V'helpers/index.htmlnuW+APK'