Files
DomFramework/src/Cacheoutput.php
2022-11-25 21:21:30 +01:00

84 lines
2.4 KiB
PHP

<?php
/** DomFramework
* @package domframework
* @author Dominique Fournier <dominique@fournier38.fr>
* @license BSD
*/
namespace Domframework;
/** This class permit to cache the ouptut of a code. If the cache is already
* available, use it.
* It resend the headers as the ouptut send them
* Use it by :
* $c = new Cacheoutput ("URL");
* Don't forget to define a variable or the cache saved is always empty
*/
class Cacheoutput
{
/** Record if the saving of pages is on going */
private $saving = false;
/** The called id */
private $id = null;
/** The called ttl */
private $ttl = null;
/** The cache object */
private $cache = null;
/** Current path at start due to lack of information in __destruct*/
private $cacheCWD = null;
/**
@param string $id The cache identifier
@param integer|null $ttl The cache Time to Leave in seconds (60s by
default)
@param string|null $method The cache method to use */
public function __construct($id, $ttl = 60, $method = "file")
{
$res = @include("domframework/cache$method.php");
if ($res === false) {
throw new \Exception(
sprintf(dgettext(
"domframework",
"Unkwnown cache method : "
), $method),
500
);
}
$this->id = $id;
$this->ttl = $ttl;
$this->cacheCWD = getcwd();
$cachemethod = "Cache$method";
$this->cache = new $cachemethod();
if ($ttl === 0) {
$this->cache->nocache = 1;
}
$res = $this->cache->read($id);
// If there is a cache : display it
if ($res !== false) {
foreach ($res["headers"] as $header) {
@header($header);
}
echo $res["content"];
exit;
}
ob_start();
$this->saving = true;
// The data are sent automatically
}
/** End of saving the data in cache */
public function __destruct()
{
// Force the path because it return to / in the destructor
chdir($this->cacheCWD);
if ($this->saving === true) {
// Do the saving of the data
$data = array("content" => ob_get_contents(),
"headers" => headers_list());
$this->cache->write($this->id, $data, $this->ttl);
}
}
}