home *** CD-ROM | disk | FTP | other *** search
- <?php
- // +----------------------------------------------------------------------+
- // | PHP version 4.0 |
- // +----------------------------------------------------------------------+
- // | Copyright (c) 1997, 1998, 1999, 2000, 2001 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@nomad.ch> |
- // | Vinai Kopp <kopp@netzarbeiter.de> |
- // +----------------------------------------------------------------------+
- //
- // $Id: Output.php,v 1.11.2.1 2001/03/23 18:36:36 chregu Exp $
-
- require_once 'Cache.php';
-
- /**
- * Class to cache the output of a script using the output buffering functions
- *
- * Simple output cache. Some pages require lots of time to compute. Caching the
- * output can increase the overall speed dramatically, especially if you use
- * a Shared Memory storage container.
- *
- * As you can see in the example the usage is extemely simple. To cache a script
- * simple put some few lines of code in front of your script and some at the end.
- * A preferrable place for this are the auto_prepend and auto_append files (=> php.ini).
- *
- * 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));
- *
- * // compute the unique handle.
- * // if your script depends on Cookie and HTTP Post data as well
- * // you should use:
- * // $cache_handle = array(
- * // "file" => $REQUEST_URI,
- * // "post" => $HTTP_POST_VAS"
- * // "cookie" => $HTTP_COOKIE_VARS
- * // );
- * // But be warned, using all GET or POST Variables as a seed
- * // can be used for a DOS attack. Calling http://www.example.com/example.php?whatever
- * // where whatever is a random text might be used to flood your cache.
- * $cache_handle = $cache->generateID($REQUEST_URI);
- *
- * // now the magic happens: if cached call die()
- * // to end the time consumptiong script script execution and use the cached value!
- * if ($content = $cache->start($cache_handle)) {
- * print $content;
- * print "<p>Cache hit</p>";
- * die();
- * }
- *
- * // time consumption script goes here.
- *
- * // store the output of the cache into the cache and print the output.
- * print $cache->end();
- * print "<p>Cache miss, stored using the ID '$id'.</p>";
- *
- * If you do not want to cache a whole page - no problem:
- *
- * if (!($content = $cache->start($cache_handle))) {
- * // do the computation here
- * print $cache->end()
- * } else {
- print $content;
- * }
- *
- * If you need an example script check the (auto_)prepend and (auto_)append
- * files of my homepage:
- *
- * http://www.ulf-wendel.de/php/show_source.php?file=prepend
- * http://www.ulf-wendel.de/php/show_source.php?file=append
- *
- * Don't know how to use it or you need profiling informations?`
- * Ask Christian he was patient with me and he'll be so with your questions ;).
- *
- * Have fun!
- *
- * @authors Ulf Wendel <ulf.wendel@phpdoc.de>
- * @version $ID: $
- * @package Cache
- * @access public
- */
- class Cache_Output extends Cache {
-
- /**
- * ID passed to start()
- *
- * @var string
- * @see start(), end()
- */
- var $output_id = "";
-
- /**
- * Group passed to start()
- *
- * @var string
- * @see start(), end()
- */
- var $output_group = "";
-
- /**
- * PEAR-Deconstructor
- * Call deconstructor of parent
- */
- function _Cache_Output()
- {
- $this->_Cache();
- }
-
- /**
- * starts the output buffering and returns an empty string or returns the cached output from the cache.
- *
- * @param string dataset ID
- * @param string cache group
- * @return string
- * @access public
- */
- function start($id, $group = "default") {
- if ($this->no_cache)
- return "";
-
- // this is already cached return it from the cache so that the user
- // can use the cache content and stop script execution
- if ($content = $this->get($id, $group))
- return $content;
-
- // remember some data to be able to fill the cache on calling end()
- $this->output_id = $id;
- $this->output_group = $group;
-
- // WARNING: we need the output buffer - possible clashes
- ob_start();
- ob_implicit_flush(false);
-
- return "";
- } // end func start
-
- /*
- * Stores the content of the output buffer into the cache and returns the content.
- *
- * @param mixed lifetime of the cached data in seconds - 0 for endless. More formats available. see Container::getExpiresAbsolute()
- * @param string additional userdefined data
- * @return string cached output
- * @access public
- * @see endPrint(), endGet(), Container::getExpiresAbsolute()
- */
- function end($expire = 0, $userdata = "") {
- $content = ob_get_contents();
- ob_end_clean();
-
- // store in the cache
- if (!$this->no_cache)
- $this->container->save($this->output_id, $content, $expire, $this->output_group, $userdata);
-
- return $content;
- } // end func end()
-
- /**
- * Stores the content of the output buffer into the cache and prints the content.
- *
- * @brother end()
- */
- function endPrint($expire = 0, $userdata = "") {
- print $this->end($expire, $userdata);
- } // end func endPrint
-
- /**
- * Returns the content of the output buffer but does not store it into the cache.
- *
- * Use this method if the content of your script is markup (XML)
- * that has to be parsed/converted (XSLT) before you can output
- * and store it into the cache using save().
- *
- * @return string
- * @access public
- * @see endPrint(), end()
- */
- function endGet() {
- $content = ob_get_contents();
- ob_end_clean();
-
- $this->output_id = "";
- $this->output_group = "";
-
- return $content;
- } // end func endGet
- } // end class output
- ?>
-