outputcompression.php

来自「视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.」· PHP 代码 · 共 302 行

PHP
302
字号
<?php// +----------------------------------------------------------------------+// | PEAR :: Cache                                                        |// +----------------------------------------------------------------------+// | Copyright (c) 1997-2003 The PHP Group                                |// +----------------------------------------------------------------------+// | This source file is subject to version 2.0 of the PHP license,       |// | that is bundled with this package in the file LICENSE, and is        |// | available at through the world-wide-web at                           |// | http://www.php.net/license/2_02.txt.                                 |// | If you did not receive a copy of the PHP license and are unable to   |// | obtain it through the world-wide-web, please send a note to          |// | license@php.net so we can mail you a copy immediately.               |// +----------------------------------------------------------------------+// | Authors: Ulf Wendel <ulf.wendel@phpdoc.de>                           |// |          Christian Stocker <chregu@phant.ch>                         |// +----------------------------------------------------------------------+require_once 'Cache/Output.php';/*** Cache using Output Buffering and contnet (gz) compression.** Usage example:**  // place this somewhere in a central config file*  define(CACHE_STORAGE_CLASS, 'file');*  // file storage needs a dir to put the cache files*  define(CACHE_DIR, '/var/tmp/');**  // get a cache object*  $cache = new Cache_Output(CACHE_STORAGE_CLASS, array('cache_dir' => CACHE_DIR));**  if (!($content = $cache->start($cache->generateID($REQUEST_URI)))) {*    print "hello world";*    $cache->endPrint(+1000);*  }*  else {*    $cache->printContent();*  }**   OR**  if (($content = $cache->start($cache->generateID($REQUEST_URI)))) {*    $cache->printContent();*    die();*  }*    print "hello world";*    $cache->endPrint(+1000);*** Based upon a case study from Christian Stocker and inspired by jpcache.** @version  $Id: OutputCompression.php,v 1.7 2003/01/04 11:54:45 mj Exp $* @author   Ulf Wendel <ulf.wendel@phpdoc.de>, Christian Stocker <chregu@phant.ch>* @access   public* @package  Cache*/class Cache_OutputCompression extends Cache_Output {        /**    * Encoding, what the user (its browser) of your website accepts    *     * "auto" stands for test using $_SERVER['HTTP_ACCEPT_ENCODING']($HTTP_ACCEPT_ENCODING).    *    * @var  string    * @see  Cache_OutputCompression(), setEncoding()    */    var $encoding = 'auto';         /**    * Method used for compression    *    * @var  string    * @see  isCompressed()    */     var $compression = '';        /**    * Sets the storage details and the content encoding used (if not autodetection)    *     * @param    string  Name of container class    * @param    array   Array with container class options    * @param    string  content encoding mode - auto => test which encoding the user accepts    */        function Cache_OutputCompression($container, $container_options = '', $encoding = 'auto') {            $this->setEncoding($encoding);        $this->Cache($container, $container_options);            } // end constructor        /**    * Call parent deconstructor.    */    function _Cache_OutputCompression() {        $this->_Cache();    } // end deconstructor        function generateID($variable) {                $this->compression = $this->getEncoding();                return md5(serialize($variable) . serialize($this->compression));    } // end generateID        function get($id, $group) {        $this->content = '';                if (!$this->caching)            return '';                if ($this->isCached($id, $group) && !$this->isExpired($id, $group))            $this->content = $this->load($id, $group);                    return $this->content;    } // end func get            /**    * Stops the output buffering, saves it to the cache and returns the _compressed_ content.     *    * If you need the uncompressed content for further procession before    * it's saved in the cache use endGet(). endGet() does _not compress_.    */        function end($expire = 0, $userdata = '') {        $content = ob_get_contents();        ob_end_clean();        // store in the cache        if ($this->caching) {            $this->extSave($this->output_id, $content, $userdata, $expire, $this->output_group);            return $this->content;                        }                    return $content;            } // end func end()            function endPrint($expire = 0, $userdata = '') {        $this->printContent($this->end($expire, $userdata));    } // end func endPrint        /**    * Saves the given data to the cache.    *     */       function extSave($id, $cachedata, $userdata, $expires = 0, $group = 'default') {        if (!$this->caching)            return true;        if ($this->compression) {                                    $len = strlen($cachedata);                        $crc = crc32($cachedata);            $cachedata = gzcompress($cachedata, 9);            $this->content = substr($cachedata, 0, strlen($cachedata) - 4) . pack('V', $crc) . pack('V', $len);                    } else {                        $this->content = $cachedata;                    }        return $this->container->save($id, $this->content, $expires, $group, $userdata);    } // end func extSave        /**    * Sends the compressed data to the user.    *     * @param    string    * @access   public    */        function printContent($content = '') {        $server = &$this->_importGlobalVariable("server");        if ('' == $content)            $content = &$this->container->cachedata;                         if ($this->compression && $this->caching) {               $etag = 'PEAR-Cache-' . md5(substr($content, -40));            header("ETag: $etag");            if (isset($server['HTTP_IF_NONE_MATCH']) && strstr(stripslashes($server['HTTP_IF_NONE_MATCH']), $etag)) {                // not modified                header('HTTP/1.0 304');                return;            } else {                   // client acceppts some encoding - send headers & data                header("Content-Encoding: {$this->compression}");                header('Vary: Accept-Encoding');                print "\x1f\x8b\x08\x00\x00\x00\x00\x00";            }                }                die($content);    } // end func printContent            /**    * Returns the encoding method of the current dataset.     *    * @access   public    * @return   string  Empty string (which evaluates to false) means no compression    */    function isCompressed() {        return $this->compression;    } // end func isCompressed    /**    * Sets the encoding to be used.    *     * @param    string  "auto" means autodetect for every client    * @access   public    * @see      $encoding    */    function setEncoding($encoding = 'auto') {        $this->encoding = $encoding;    } // end func setEncoding            /**    * Returns the encoding to be used for the data transmission to the client.    *    * @see      setEncoding()    */        function getEncoding() {        $server = &$this->_importGlobalVariable("server");        // encoding set by user            if ('auto' != $this->encoding)            return $this->encoding;                // check what the client accepts        if (false !== strpos($server['HTTP_ACCEPT_ENCODING'], 'x-gzip'))            return 'x-gzip';        if (false !== strpos($server['HTTP_ACCEPT_ENCODING'], 'gzip'))            return 'gzip';                    // no compression        return '';            } // end func getEncoding    // {{{ _importGlobalVariable()    /**     * Import variables from special namespaces.     *     * @access private     * @param string Type of variable (server, session, post)     * @return array     */    function &_importGlobalVariable($variable)     {              $var = null;        switch (strtolower($variable)) {            case "server" :                if (isset($_SERVER)) {                    $var = &$_SERVER;                } else {                    $var = &$GLOBALS['HTTP_SERVER_VARS'];                }                break;            case "session" :                if (isset($_SESSION)) {                    $var = &$_SESSION;                } else {                    $var = &$GLOBALS['HTTP_SESSION_VARS'];                }                break;            case "post" :                if (isset($_POST)) {                    $var = &$_POST;                } else {                    $var = &$GLOBALS['HTTP_POST_VARS'];                }                break;            default:                break;        }        return $var;    }     // }}} // end class OutputCompression?>

⌨️ 快捷键说明

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