setBackend($backendObject); return $frontendObject; } /** * Backend Constructor * * @param string $backend * @param array $backendOptions * @param boolean $customBackendNaming * @param boolean $autoload * @return Zend_Cache_Backend */ public static function _makeBackend($backend, $backendOptions, $customBackendNaming = false, $autoload = false) { if (!$customBackendNaming) { $backend = self::_normalizeName($backend); } if (in_array($backend, Zend_Cache::$standardBackends)) { // we use a standard backend $backendClass = 'Zend_Cache_Backend_' . $backend; // security controls are explicit require_once str_replace('_', DIRECTORY_SEPARATOR, $backendClass) . '.php'; } else { // we use a custom backend if (!preg_match('~^[\w]+$~D', $backend)) { Zend_Cache::throwException("Invalid backend name [$backend]"); } if (!$customBackendNaming) { // we use this boolean to avoid an API break $backendClass = 'Zend_Cache_Backend_' . $backend; } else { $backendClass = $backend; } if (!$autoload) { $file = str_replace('_', DIRECTORY_SEPARATOR, $backendClass) . '.php'; if (!(self::_isReadable($file))) { self::throwException("file $file not found in include_path"); } require_once $file; } } return new $backendClass($backendOptions); } /** * Frontend Constructor * * @param string $frontend * @param array $frontendOptions * @param boolean $customFrontendNaming * @param boolean $autoload * @return Zend_Cache_Core|Zend_Cache_Frontend */ public static function _makeFrontend($frontend, $frontendOptions = array(), $customFrontendNaming = false, $autoload = false) { if (!$customFrontendNaming) { $frontend = self::_normalizeName($frontend); } if (in_array($frontend, self::$standardFrontends)) { // we use a standard frontend // For perfs reasons, with frontend == 'Core', we can interact with the Core itself $frontendClass = 'Zend_Cache_' . ($frontend != 'Core' ? 'Frontend_' : '') . $frontend; // security controls are explicit require_once str_replace('_', DIRECTORY_SEPARATOR, $frontendClass) . '.php'; } else { // we use a custom frontend if (!preg_match('~^[\w]+$~D', $frontend)) { Zend_Cache::throwException("Invalid frontend name [$frontend]"); } if (!$customFrontendNaming) { // we use this boolean to avoid an API break $frontendClass = 'Zend_Cache_Frontend_' . $frontend; } else { $frontendClass = $frontend; } if (!$autoload) { $file = str_replace('_', DIRECTORY_SEPARATOR, $frontendClass) . '.php'; if (!(self::_isReadable($file))) { self::throwException("file $file not found in include_path"); } require_once $file; } } return new $frontendClass($frontendOptions); } /** * Throw an exception * * Note : for perf reasons, the "load" of Zend/Cache/Exception is dynamic * @param string $msg Message for the exception * @throws Zend_Cache_Exception */ public static function throwException($msg, Exception $e = null) { // For perfs reasons, we use this dynamic inclusion require_once 'Zend/Cache/Exception.php'; throw new Zend_Cache_Exception($msg, 0, $e); } /** * Normalize frontend and backend names to allow multiple words TitleCased * * @param string $name Name to normalize * @return string */ protected static function _normalizeName($name) { $name = ucfirst(strtolower($name)); $name = str_replace(array('-', '_', '.'), ' ', $name); $name = ucwords($name); $name = str_replace(' ', '', $name); if (stripos($name, 'ZendServer') === 0) { $name = 'ZendServer_' . substr($name, strlen('ZendServer')); } return $name; } /** * Returns TRUE if the $filename is readable, or FALSE otherwise. * This function uses the PHP include_path, where PHP's is_readable() * does not. * * Note : this method comes from Zend_Loader (see #ZF-2891 for details) * * @param string $filename * @return boolean */ private static function _isReadable($filename) { if (!$fh = @fopen($filename, 'r', true)) { return false; } @fclose($fh); return true; } }