core.php

来自「Bug tracker, and reporter.」· PHP 代码 · 共 475 行 · 第 1/2 页

PHP
475
字号
     *     * @param  string $id Cache id     * @return boolean True is a cache is available, false else     */    public function test($id)    {        if (!$this->_options['caching']) {            return false;        }        $id = $this->_id($id); // cache id may need prefix        self::_validateIdOrTag($id);        $this->_lastId = $id;        return $this->_backend->test($id);    }    /**     * Save some data in a cache     *     * @param  mixed $data           Data to put in cache (can be another type than string if automatic_serialization is on)     * @param  cache $id             Cache id (if not set, the last cache id will be used)     * @param  array $tags           Cache tags     * @param  int $specificLifetime If != false, set a specific lifetime for this cache record (null => infinite lifetime)     * @throws Zend_Cache_Exception     * @return boolean True if no problem     */    public function save($data, $id = null, $tags = array(), $specificLifetime = false)    {        if (!$this->_options['caching']) {            return true;        }        if (is_null($id)) {            $id = $this->_lastId;        } else {            $id = $this->_id($id);        }        self::_validateIdOrTag($id);        self::_validateTagsArray($tags);        if ($this->_options['automatic_serialization']) {            // we need to serialize datas before storing them            $data = serialize($data);        } else {            if (!is_string($data)) {                Zend_Cache::throwException("Datas must be string or set automatic_serialization = true");            }        }        // automatic cleaning        if ($this->_options['automatic_cleaning_factor'] > 0) {            $rand = rand(1, $this->_options['automatic_cleaning_factor']);            if ($rand==1) {                if ($this->_backend->isAutomaticCleaningAvailable()) {                    $this->clean(Zend_Cache::CLEANING_MODE_OLD);                } else {                    $this->_log('Zend_Cache_Core::save() / automatic cleaning is not available with this backend');                }            }        }        if ($this->_options['ignore_user_abort']) {            $abort = ignore_user_abort(true);        }        $result = $this->_backend->save($data, $id, $tags, $specificLifetime);        if ($this->_options['ignore_user_abort']) {            ignore_user_abort($abort);         }        if (!$result) {            // maybe the cache is corrupted, so we remove it !            if ($this->_options['logging']) {                $this->_log("Zend_Cache_Core::save() : impossible to save cache (id=$id)");            }            $this->remove($id);            return false;        }        if ($this->_options['write_control']) {            $data2 = $this->_backend->load($id, true);            if ($data!=$data2) {                $this->_log('Zend_Cache_Core::save() / write_control : written and read data do not match');                $this->remove($id);                return false;            }        }        return true;    }    /**     * Remove a cache     *     * @param  string $id Cache id to remove     * @return boolean True if ok     */    public function remove($id)    {        if (!$this->_options['caching']) {            return true;        }        $id = $this->_id($id); // cache id may need prefix        self::_validateIdOrTag($id);        return $this->_backend->remove($id);    }    /**     * Clean cache entries     *     * Available modes are :     * 'all' (default)  => remove all cache entries ($tags is not used)     * 'old'            => remove too old cache entries ($tags is not used)     * 'matchingTag'    => remove cache entries matching all given tags     *                     ($tags can be an array of strings or a single string)     * 'notMatchingTag' => remove cache entries not matching one of the given tags     *                     ($tags can be an array of strings or a single string)     *     * @param  string       $mode     * @param  array|string $tags     * @throws Zend_Cache_Exception     * @return boolean True if ok     */    public function clean($mode = 'all', $tags = array())    {        if (!$this->_options['caching']) {            return true;        }        if (!in_array($mode, array(Zend_Cache::CLEANING_MODE_ALL, Zend_Cache::CLEANING_MODE_OLD, Zend_Cache::CLEANING_MODE_MATCHING_TAG, Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG))) {            Zend_Cache::throwException('Invalid cleaning mode');        }        self::_validateTagsArray($tags);        return $this->_backend->clean($mode, $tags);    }    /**     * Validate a cache id or a tag (security, reliable filenames, reserved prefixes...)     *     * Throw an exception if a problem is found     *     * @param  string $string Cache id or tag     * @throws Zend_Cache_Exception     * @return void     */    private static function _validateIdOrTag($string)    {        if (!is_string($string)) {            Zend_Cache::throwException('Invalid id or tag : must be a string');        }        if (substr($string, 0, 9) == 'internal-') {            Zend_Cache::throwException('"internal-*" ids or tags are reserved');        }        if (!preg_match('~^[\w]+$~D', $string)) {            Zend_Cache::throwException("Invalid id or tag '$string' : must use only [a-zA-Z0-9_]");        }    }    /**     * Validate a tags array (security, reliable filenames, reserved prefixes...)     *     * Throw an exception if a problem is found     *     * @param  array $tags Array of tags     * @throws Zend_Cache_Exception     * @return void     */    private static function _validateTagsArray($tags)    {        if (!is_array($tags)) {            Zend_Cache::throwException('Invalid tags array : must be an array');        }        foreach($tags as $tag) {            self::_validateIdOrTag($tag);        }        reset($tags);    }    /**     * Make sure if we enable logging that the Zend_Log class     * is available.     * Create a default log object if none is set.     *     * @throws Zend_Cache_Exception     * @return void     */    protected function _loggerSanity()    {        if (!isset($this->_options['logging']) || !$this->_options['logging']) {            return;        }        try {            /**             * @see Zend_Loader             * @see Zend_Log             */            require_once 'Zend/Loader.php';            Zend_Loader::loadClass('Zend_Log');        } catch (Zend_Exception $e) {            Zend_Cache::throwException('Logging feature is enabled but the Zend_Log class is not available');        }        if (isset($this->_options['logger']) && $this->_options['logger'] instanceof Zend_Log) {            return;        }        // Create a default logger to the standard output stream        Zend_Loader::loadClass('Zend_Log_Writer_Stream');        $logger = new Zend_Log(new Zend_Log_Writer_Stream('php://output'));        $this->_options['logger'] = $logger;    }    /**     * Log a message at the WARN (4) priority.     *     * @param string $message     * @throws Zend_Cache_Exception     * @return void     */    protected function _log($message, $priority = 4)    {        if (!$this->_options['logging']) {            return;        }        if (!(isset($this->_options['logger']) || $this->_options['logger'] instanceof Zend_Log)) {            Zend_Cache::throwException('Logging is enabled but logger is not set');        }        $logger = $this->_options['logger'];        $logger->log($message, $priority);    }    /**     * Make and return a cache id     *     * Checks 'cache_id_prefix' and returns new id with prefix or simply the id if null     *     * @param  string $id Cache id     * @return string Cache id (with or without prefix)     */      private function _id($id)    {        if (!is_null($id) && isset($this->_options['cache_id_prefix'])) {            return $this->_options['cache_id_prefix'] . $id; // return with prefix        }        return $id; // no prefix, just return the $id passed    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?