mirror of
https://github.com/e107inc/e107.git
synced 2025-07-28 10:20:45 +02:00
172
class2.php
172
class2.php
@@ -2295,6 +2295,178 @@ class error_handler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Manage Headers sent to browser.
|
||||||
|
* It is important to specify one of Expires or Cache-Control max-age, and one of Last-Modified or ETag, for all cacheable resources.
|
||||||
|
* It is redundant to specify both Expires and Cache-Control: max-age, or to specify both Last-Modified and ETag.
|
||||||
|
* Reference : http://css-tricks.com/snippets/php/intelligent-php-cache-control/
|
||||||
|
* XXX Etag cannot be relied on as some hosts have Etag disabled.
|
||||||
|
* XXX session_cache_limiter('private') will override some of the things below and bring back our browser cache issues.
|
||||||
|
*/
|
||||||
|
class e_http_header
|
||||||
|
{
|
||||||
|
private $content;
|
||||||
|
private $etag;
|
||||||
|
private $compress_output = false;
|
||||||
|
private $compression_level = 6;
|
||||||
|
private $compression_browser_support = false;
|
||||||
|
private $compression_server_support = false;
|
||||||
|
private $headers = array();
|
||||||
|
|
||||||
|
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
if (strstr(varset($_SERVER['HTTP_ACCEPT_ENCODING'], ''), 'gzip'))
|
||||||
|
{
|
||||||
|
$this->compression_browser_support = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ini_get("zlib.output_compression") == '' && function_exists("gzencode"))
|
||||||
|
{
|
||||||
|
$this->compression_server_support = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->compress_output = varset(e107::getPref('compress_output'),false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function setContent($content)
|
||||||
|
{
|
||||||
|
$this->etag = md5($content);
|
||||||
|
$this->content = $content;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setHeader($header, $force=false, $response_code=null)
|
||||||
|
{
|
||||||
|
list($key,$val) = explode(':',$header,2);
|
||||||
|
$this->headers[$key] = $val;
|
||||||
|
header($header, $force, $response_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
function debug()
|
||||||
|
{
|
||||||
|
|
||||||
|
echo "<h3>Server Headers</h3>";
|
||||||
|
$server = getallheaders();
|
||||||
|
ksort($server);
|
||||||
|
print_a($server);
|
||||||
|
echo "<h3>e107 Headers</h3>";
|
||||||
|
ksort($this->headers);
|
||||||
|
print_a($this->headers);
|
||||||
|
var_dump($this->compress_output);
|
||||||
|
|
||||||
|
$server = array();
|
||||||
|
foreach($_SERVER as $k=>$v)
|
||||||
|
{
|
||||||
|
if(substr($k,0,4) == 'HTTP')
|
||||||
|
{
|
||||||
|
$server[$k] = $v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
echo "<h3>_SERVER</h3>";
|
||||||
|
print_a($server);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function send()
|
||||||
|
{
|
||||||
|
// Disable caching of html.
|
||||||
|
/*
|
||||||
|
$this->setHeader("Expires: 0", true);
|
||||||
|
$this->setHeader("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT", true);
|
||||||
|
$this->setHeader("Cache-Control: no-store, no-cache, must-revalidate", true);
|
||||||
|
$this->setHeader("Cache-Control: post-check=0, pre-check=0", false);
|
||||||
|
$this->setHeader("Pragma: no-cache");
|
||||||
|
$this->setHeader("Cache-Control: max-age=0", false);
|
||||||
|
*/
|
||||||
|
// $this->setHeader("Cache-Control: public", true);
|
||||||
|
|
||||||
|
|
||||||
|
$canCache = e107::canCache();
|
||||||
|
|
||||||
|
// $this->setHeader("Cache-Control: must-revalidate", true);
|
||||||
|
|
||||||
|
if($canCache && !deftrue('e_NOCACHE') && $_SERVER['REQUEST_METHOD'] === 'GET' && $_SERVER['QUERY_STRING'] != 'logout')
|
||||||
|
{
|
||||||
|
// header("Cache-Control: must-revalidate", true);
|
||||||
|
if(e107::getPref('site_page_expires')) // TODO - allow per page
|
||||||
|
{
|
||||||
|
if (function_exists('date_default_timezone_set'))
|
||||||
|
{
|
||||||
|
date_default_timezone_set('UTC');
|
||||||
|
}
|
||||||
|
$time = time()+ (integer) e107::getPref('site_page_expires');
|
||||||
|
$this->setHeader('Expires: '.gmdate("D, d M Y H:i:s", $time).' GMT', true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$canCache = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if($this->compress_out != false && $this->compression_server_support == true && $this->compression_browser_support == true)
|
||||||
|
{
|
||||||
|
// $this->setHeader("ETag: \"{$this->etag}-gzip\"");
|
||||||
|
$this->setHeader('ETag: "'.$this->etag.'-gzip"', true);
|
||||||
|
$page = gzencode($this->content, $this->compression_level);
|
||||||
|
$this->setHeader("Content-Encoding: gzip", true);
|
||||||
|
$this->setHeader("Content-Length: ".strlen($page), true);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if($this->compression_browser_support ==true)
|
||||||
|
{
|
||||||
|
$this->setHeader('ETag: "'.$this->etag.'-gzip"', true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->setHeader('ETag: "'.$this->etag.'"', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->setHeader("Content-Length: ".strlen($this->content), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->setHeader("X-Powered-By: e107", true); // no less secure than e107-specific html.
|
||||||
|
|
||||||
|
if($this->compression_server_support == true)
|
||||||
|
{
|
||||||
|
$this->setHeader('Vary: Accept-Encoding');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->setHeader('Vary: Accept');
|
||||||
|
}
|
||||||
|
|
||||||
|
// should come after the Etag header
|
||||||
|
if ($canCache && isset($_SERVER['HTTP_IF_NONE_MATCH']))
|
||||||
|
{
|
||||||
|
$IF_NONE_MATCH = str_replace('"','',$_SERVER['HTTP_IF_NONE_MATCH']);
|
||||||
|
if($IF_NONE_MATCH == $this->etag || ($IF_NONE_MATCH == ($this->etag."-gzip")))
|
||||||
|
{
|
||||||
|
$this->setHeader('HTTP/1.1 304 Not Modified');
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$sql->db_Mark_Time('(After class2)');
|
$sql->db_Mark_Time('(After class2)');
|
||||||
|
|
||||||
|
|
||||||
|
@@ -332,78 +332,11 @@ $e107->destruct();
|
|||||||
//
|
//
|
||||||
$page = ob_get_clean();
|
$page = ob_get_clean();
|
||||||
|
|
||||||
$etag = md5($page);
|
// New - see class2.php
|
||||||
|
$ehd = new e_http_header;
|
||||||
//header('Pragma:');
|
$ehd->setContent($page);
|
||||||
// previously disabled or there is posted data
|
$ehd->send();
|
||||||
$canCache = e107::canCache();
|
// $ehd->debug();
|
||||||
header("Cache-Control: must-revalidate", true); //XXX testing it here to check for improvement.
|
|
||||||
if($canCache && !deftrue('e_NOCACHE') && $_SERVER['REQUEST_METHOD'] === 'GET' && $_SERVER['QUERY_STRING'] != 'logout')
|
|
||||||
{
|
|
||||||
// header("Cache-Control: must-revalidate", true);
|
|
||||||
if(e107::getPref('site_page_expires')) // TODO - allow per page
|
|
||||||
{
|
|
||||||
if (function_exists('date_default_timezone_set'))
|
|
||||||
{
|
|
||||||
date_default_timezone_set('UTC');
|
|
||||||
}
|
|
||||||
$time = time()+ (integer) e107::getPref('site_page_expires');
|
|
||||||
header('Expires: '.gmdate("D, d M Y H:i:s", $time).' GMT', true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$canCache = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$pref['compression_level'] = 6;
|
|
||||||
$browser_support = FALSE;
|
|
||||||
$server_support = FALSE;
|
|
||||||
if (strstr(varset($_SERVER['HTTP_ACCEPT_ENCODING'], ''), 'gzip'))
|
|
||||||
{
|
|
||||||
$browser_support = true;
|
|
||||||
}
|
|
||||||
if(ini_get("zlib.output_compression") == '' && function_exists("gzencode"))
|
|
||||||
{
|
|
||||||
$server_support = true;
|
|
||||||
}
|
|
||||||
if(varset($pref['compress_output'],false) && $server_support == true && $browser_support == true)
|
|
||||||
{
|
|
||||||
$level = intval($pref['compression_level']);
|
|
||||||
header("ETag: \"{$etag}-gzip\"");
|
|
||||||
$page = gzencode($page, $level);
|
|
||||||
header("Content-Encoding: gzip", true);
|
|
||||||
header("Content-Length: ".strlen($page), true);
|
|
||||||
header('Vary: Accept-Encoding');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if($browser_support==TRUE)
|
|
||||||
{
|
|
||||||
header("ETag: \"{$etag}-gzip\"");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
header("ETag: \"{$etag}\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
header("Content-Length: ".strlen($page), true);
|
|
||||||
header('Vary: Accept');
|
|
||||||
}
|
|
||||||
|
|
||||||
header("X-Powered-By: e107", true); // no less secure than e107-specific html.
|
|
||||||
|
|
||||||
|
|
||||||
// should come after the Etag header
|
|
||||||
if ($canCache && isset($_SERVER['HTTP_IF_NONE_MATCH']))
|
|
||||||
{
|
|
||||||
$IF_NONE_MATCH = str_replace('"','',$_SERVER['HTTP_IF_NONE_MATCH']);
|
|
||||||
if($IF_NONE_MATCH == $etag || ($IF_NONE_MATCH == ($etag."-gzip")))
|
|
||||||
{
|
|
||||||
header('HTTP/1.1 304 Not Modified');
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// real output
|
// real output
|
||||||
echo $page;
|
echo $page;
|
||||||
|
@@ -467,13 +467,10 @@ class e_session
|
|||||||
|
|
||||||
if ($this->_sessionCacheLimiter)
|
if ($this->_sessionCacheLimiter)
|
||||||
{
|
{
|
||||||
session_cache_limiter((string) $this->_sessionCacheLimiter);
|
session_cache_limiter((string) $this->_sessionCacheLimiter); //XXX Remove and have e_headers class handle it?
|
||||||
}
|
|
||||||
elseif(!defined('e_NOCACHE') || !e_NOCACHE)
|
|
||||||
{
|
|
||||||
session_cache_limiter('private');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
session_start();
|
session_start();
|
||||||
$this->_sessionStarted = true;
|
$this->_sessionStarted = true;
|
||||||
return $this;
|
return $this;
|
||||||
|
Reference in New Issue
Block a user