2016-10-06 15:57:01 +00:00
|
|
|
<?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> |
|
|
|
|
// | Vinai Kopp <kopp@netzarbeiter.de> |
|
|
|
|
// +----------------------------------------------------------------------+
|
|
|
|
//
|
2019-07-03 11:58:28 +00:00
|
|
|
// $Id$
|
2016-10-06 15:57:01 +00:00
|
|
|
|
|
|
|
cInclude('pear', 'Cache/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_VARS,
|
|
|
|
* // '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->caching)
|
|
|
|
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->caching)
|
|
|
|
$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 = '') {
|
|
|
|
$this->printContent($this->end($expire, $userdata));
|
|
|
|
} // end func endPrint
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sends the data to the user.
|
|
|
|
* This is for compatibility with OutputCompression
|
|
|
|
*
|
|
|
|
* @param string
|
|
|
|
* @access public
|
|
|
|
*/
|
|
|
|
function printContent($content = '') {
|
|
|
|
if ('' == $content)
|
|
|
|
$content = &$this->container->cachedata;
|
|
|
|
|
|
|
|
print $content;
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* 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
|
|
|
|
?>
|