1
0
mirror of https://github.com/e107inc/e107.git synced 2025-08-01 12:20:44 +02:00

(experimental changes) overall front-end pages and e_jslib.php load speed up (304 not modified tests passed), bugfixes, better headers, e_meta works fine with JS manager now

This commit is contained in:
secretr
2010-12-16 16:56:00 +00:00
parent 0e797fcc63
commit 6f49745358
5 changed files with 225 additions and 89 deletions

View File

@@ -18,12 +18,7 @@
// prevent notices/warnings to break JS source
error_reporting(0);
//output cache if available before calling the api
e_jslib_cache_out();
//v0.8 - we need THEME defines here (do we?) - WE DON'T
//$_E107 = array('no_forceuserupdate' => 1, 'no_online' => 1, 'no_menus' => 1, 'no_prunetmp' => 1);
$_E107['minimal'] = true;
session_cache_limiter('private');
//admin or front-end call
if (strpos($_SERVER['QUERY_STRING'], '_admin') !== FALSE)
@@ -34,11 +29,31 @@ else
{
define('USER_AREA', true); //force user area
}
// no-cache check
if (strpos($_SERVER['QUERY_STRING'], '_nocache') !== FALSE)
{
define('e_NOCACHE', true); //force admin area
}
else
{
define('e_NOCACHE', false); //force user area
}
if(!e_NOCACHE) session_cache_limiter('private');
else session_cache_limiter('nocache');
//output cache if available before calling the api
e_jslib_cache_out();
//v0.8 - we need THEME defines here (do we?) - WE DON'T
//$_E107 = array('no_forceuserupdate' => 1, 'no_online' => 1, 'no_menus' => 1, 'no_prunetmp' => 1);
$_E107['minimal'] = true;
//call jslib handler, render content
require_once ("../class2.php");
require_once (e_HANDLER.'jslib_handler.php');
$jslib = new e_jslib();
//require_once (e_HANDLER.'jslib_handler.php');
//$jslib = new e_jslib();
$jslib = e107::getObject('e_jslib', null, e_HANDLER.'jslib_handler.php');
$jslib->getContent();
exit;
@@ -54,11 +69,15 @@ exit;
*/
function e_jslib_cache_out()
{
if(e_NOCACHE) return;
$encoding = e_jslib_browser_enc(); //NOTE - should be called first
$cacheFile = e_jslib_is_cache($encoding);
if ($cacheFile)
{
//kill any output buffering - better performance and 304 not modified requirement
while (@ob_end_clean());
if (function_exists('date_default_timezone_set'))
{
date_default_timezone_set('UTC');
@@ -67,16 +86,11 @@ function e_jslib_cache_out()
// last modification time
$lmodified = filemtime($cacheFile);
// not modified - send 304 and exit
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lmodified)
{
header("HTTP/1.1 304 Not Modified", true);
exit;
}
// send last modified date
header('Cache-Control: must-revalidate');
header('Last-modified: '.gmdate('r', $lmodified), true);
//header('Cache-Control: must-revalidate');
//header('Last-modified: '.gmdate('r', $lmodified), true);
if($lmodified) header('Last-modified: '.gmdate("D, d M Y H:i:s", $lmodified).' GMT', true);
// send content type and encoding
header('Content-type: text/javascript', true);
@@ -87,12 +101,37 @@ function e_jslib_cache_out()
// Expire header - 1 year
$time = time()+ 365 * 86400;
header('Expires: '.gmdate('r', $time), true);
//header('Expires: '.gmdate('r', $time), true);
header('Expires: '.gmdate("D, d M Y H:i:s", $time).' GMT', true);
//kill any output buffering - better performance
while (@ob_end_clean());
header('Cache-Control: must-revalidate', true);
echo @file_get_contents($cacheFile);
// not modified check by last modified time - send 304 and exit
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lmodified)
{
header("HTTP/1.1 304 Not Modified", true);
exit;
}
$page = @file_get_contents($cacheFile);
$etag = md5($page).($encoding ? '-'.$encoding : '');
header('Content-Length: '.strlen($page), true);
header('ETag: '.$etag, true);
// not modified check by Etag
if (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.'-'.$encoding)))
{
header('HTTP/1.1 304 Not Modified');
exit();
}
}
echo $page;
//TODO - debug
//@file_put_contents('cache/e_jslib_log', "----------\ncache used - ".$cacheFile."\n\n", FILE_APPEND);
exit;

View File

@@ -670,7 +670,7 @@ class e_jsmanager
*
* @param string $mod core|plugin|theme|header|footer|header_inline|footer_inline|core_css|plugin_css|theme_css|other_css|inline_css
* @param integer $zone 1-5 - only used when in 'header','footer','header_inline' and 'footer_inline' render mod
* @param boolean $external exrernal file calls, only used when NOT in 'header_inline' and 'footer_inline' render mod
* @param boolean $external external file calls, only used when NOT in 'header_inline' and 'footer_inline' render mod
* @param boolean $return
* @return string JS content - only if $return is true
*/
@@ -1082,5 +1082,39 @@ class e_jsmanager
$core->setPref($key, $libs);
return $this;
}
/**
* Get current object data
* @return array
*/
public function getData()
{
$data = get_class_vars(__CLASS__);
unset($data['_instance'], $data['_in_admin']);
$kdata = array_keys($data);
$instance = self::getInstance();
$data = array();
foreach ($kdata as $prop)
{
$data[$prop] = $this->$prop;
}
return $data;
}
/**
* Set all current object data
* @param $data
* @return e_jsmanager
*/
public function setData($data)
{
if(!is_array($data)) return $this;
foreach ($data as $prop => $val)
{
if('_instance' == $prop || '_in_admin' == $prop) continue;
$this->$prop = $val;
}
return $this;
}
}

View File

@@ -12,7 +12,7 @@
* $Author$
*
*/
global $pref, $eplug_admin, $THEME_JSLIB, $THEME_CORE_JSLIB;
global $pref, $eplug_admin;
class e_jslib
{
@@ -22,6 +22,36 @@ class e_jslib
}
/**
* Called from HEADERF
* @return string
*/
public function renderHeader($where = 'front', $return = false)
{
// FIXME: convert e107.js.php to pure e107.js file
// FIXME: 'e_jslib_browser_cache' used by js_manager - add it together with all new prefs (JS management tab, Site preferences area)
// FIXME: option to use external sources (e.g. google) even if JS is combined (script tags for external sources)
if(!e107::getPref('e_jslib_nocombine'))
{
$hash = md5(serialize(varset($pref['e_jslib'])).e107::getPref('e_jslib_browser_cache', 0).THEME.e_LANGUAGE.ADMIN).'_'.$where;
// TODO disable cache in debug mod
$hash .= (e107::getPref('e_jslib_nocache') ? '_nocache' : '').(e107::getPref('e_jslib_gzip') ? '' : '_nogzip');
$ret = "<script type='text/javascript' src='".e_FILE_ABS."e_jslib.php?{$hash}'></script>\n";
if($return) $ret;
echo $ret;
return;
}
$e_jsmanager = e107::getJs();
// script tags
$ret = $e_jsmanager->renderJs('core', null, true, $return);
$ret .= $e_jsmanager->renderJs('plugin', null, true, $return);
$ret .= $e_jsmanager->renderJs('theme', null, true, $return);
return $ret;
}
/**
* Collect & output content of all available JS libraries (requires e107 API)
* FIXME
@@ -57,34 +87,41 @@ class e_jslib
// last modification time for loaded files
$lmodified = max($lmodified);
// send content type
header('Content-type: text/javascript', true);
if(deftrue('e_NOCACHE'))
{
$this->content_out($lmodified);
}
if (function_exists('date_default_timezone_set'))
{
date_default_timezone_set('UTC');
}
// send last modified date
header('Cache-Control: must-revalidate', true);
if($lmodified) header('Last-modified: '.gmdate("D, d M Y H:i:s", $lmodified).' GMT', true);
//if($lmodified) header('Last-modified: '.gmdate('r', $lmodified), true);
// Expire header - 1 year
$time = time()+ 365 * 86400;
header('Expires: '.gmdate("D, d M Y H:i:s", $time).' GMT', true);
// If-Modified check only if cache disabled
// if cache is enabled, cache file modification date is set to $lmodified
/*if(!e107::getPref('syscachestatus'))
if(!e107::getPref('syscachestatus'))
{
// not modified - send 304 and exit
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lmodified)
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $lmodified && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lmodified)
{
header("HTTP/1.1 304 Not Modified", true);
exit;
}
}*/
// send last modified date
header('Cache-Control: must-revalidate');
header('Last-modified: '.gmdate('r', $lmodified), true);
// send content type
header('Content-type: text/javascript', true);
// Expire header - 1 year
$time = time()+ 365 * 86400;
header('Expires: '.gmdate('r', $time), true);
}
//Output
$this->content_out($lmodified);
@@ -197,6 +234,21 @@ class e_jslib
$contents = ob_get_contents();
ob_end_clean();
$etag = md5($page).($encoding ? '-'.$encoding : '');
header('ETag: '.$etag, true);
if($encoding) header('Content-Encoding: ' . $encoding);
if (!deftrue('e_NOCACHE') && 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.'-'.$encoding)))
{
header('HTTP/1.1 304 Not Modified');
exit();
}
}
if ($encoding)
{
$gzdata = "\x1f\x8b\x08\x00\x00\x00\x00\x00";
@@ -210,8 +262,7 @@ class e_jslib
$gsize = strlen($gzdata);
$this->set_cache($gzdata, $encoding, $lmodified);
header('Content-Encoding: ' . $encoding);
//header('Content-Length: '.$gsize);
header('Content-Length: '.$gsize);
header('X-Content-size: ' . $size);
print($gzdata);
//TODO - log/debug
@@ -221,6 +272,7 @@ class e_jslib
{
//header('Content-Length: '.strlen($contents));
$this->set_cache($contents, '', $lmodified);
header('Content-Length: '.strlen($contents));
print($contents);
//TODO - log/debug
//@file_put_contents('cache/e_jslib_log', "----------\nno cache used - raw\n\n", FILE_APPEND);
@@ -238,13 +290,13 @@ class e_jslib
*/
function set_cache($contents, $encoding = '', $lmodified = 0)
{
if (e107::getPref('syscachestatus'))
if (!deftrue('e_NOCACHE') && e107::getPref('syscachestatus'))
{
$cacheFile = $this->cache_filename($encoding);
if(!$lmodified) $lmodified = time();
@file_put_contents($cacheFile, $contents);
@chmod($cacheFile, 0775);
@touch($cacheFile, $lmodified);
if($lmodified) @touch($cacheFile, $lmodified);
}
}

View File

@@ -279,8 +279,10 @@ if (abs($_serverTime - $lastSet) > 120)
* Drawback: each update may cause all server times to display a bit different
*/
echo "<script type='text/javascript'>\n";
echo "SyncWithServerTime('{$_serverTime}', '{$_serverPath}', '{$_serverDomain}');
</script>\n";
echo " SyncWithServerTime('', '{$_serverPath}', '{$_serverDomain}');\n";
//tdOffset disabled as it can't live together with HTTP_IF_NONE_MATCH (page load speed)
//echo " SyncWithServerTime('{$_serverTime}', '{$_serverPath}', '{$_serverDomain}');\n";
echo "</script>\n";
}
//
@@ -295,21 +297,16 @@ $page = ob_get_clean();
$etag = md5($page);
if (isset($_SERVER['HTTP_IF_NONE_MATCH']))
// previously disabled or there is posted data
if(!deftrue('e_NOCACHE') && empty($_POST))
{
$IF_NONE_MATCH = str_replace('"','',$_SERVER['HTTP_IF_NONE_MATCH']);
if($IF_NONE_MATCH == $etag || ($IF_NONE_MATCH == ($etag."-gzip")))
header("Cache-Control: must-revalidate", true);
if (function_exists('date_default_timezone_set'))
{
header('HTTP/1.1 304 Not Modified');
exit();
date_default_timezone_set('UTC');
}
}
if(!defined('e_NOCACHE'))
{
header("Cache-Control: must-revalidate");
$time = time()+ 365 * 86400;
header('Expires: '.gmdate("D, d M Y H:i:s", $time).' GMT', true);
}
$pref['compression_level'] = 6;
@@ -330,7 +327,6 @@ if(varset($pref['compress_output'],false) && $server_support == true && $browser
$page = gzencode($page, $level);
header("Content-Encoding: gzip", true);
header("Content-Length: ".strlen($page), true);
echo $page;
}
else
{
@@ -344,9 +340,23 @@ else
}
header("Content-Length: ".strlen($page), true);
echo $page;
}
// should come after the Etag header
if (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
echo $page;
unset($In_e107_Footer);
$e107_Clean_Exit=TRUE; // For registered shutdown function -- let it know all is well!
?>

View File

@@ -143,6 +143,24 @@ unset($e_headers);
$e_js = e107::getJs();
$e_pref = e107::getConfig('core');
// --- Load plugin Meta files - now possible to add to all zones! --------
$e_meta_content = '';
if (is_array($pref['e_meta_list']))
{
ob_start();
foreach($pref['e_meta_list'] as $val)
{
if(is_readable(e_PLUGIN.$val."/e_meta.php"))
{
require_once(e_PLUGIN.$val."/e_meta.php");
}
}
// content will be added later
// NOTE: not wise to do e_meta output, use JS Manager!
$e_meta_content = ob_get_contents();
ob_end_clean();
}
// Register Plugin specific CSS
// DEPRECATED, use $e_js->pluginCSS('myplug', 'style/myplug.css'[, $media = 'all|screen|...']);
if (isset($eplug_css) && $eplug_css)
@@ -246,13 +264,6 @@ echo "\n<!-- footer_theme_css -->\n";
$e_js->renderJs('inline_css', false, 'css', false);
echo "\n<!-- footer_inline_css -->\n";
/*
if((isset($pref['enable_png_image_fix']) && $pref['enable_png_image_fix'] == true) || (isset($sleight) && $sleight == true))
{
echo "<script type='text/javascript' src='".e_FILE_ABS."sleight_js.php'></script>\n\n";
}
*/
//IEpngfix - visible by IE6 only
// FIXME - disable this style block via JS for all GOOD browsers.
if($e_pref->get('enable_png_image_fix') || (isset($sleight) && $sleight == true)) // FIXME - KILL this GLOBAL!
@@ -275,8 +286,8 @@ if($e_pref->get('enable_png_image_fix') || (isset($sleight) && $sleight == true)
//
// E: Send JS all in once
// Read here why - http://code.google.com/speed/page-speed/docs/rtt.html#PutStylesBeforeScripts
// TODO - more work (zones, eplug_js, headerjs etc order)
//
// TODO - more work (zones, eplug_js, headerjs etc order, external JS/CSS)
// TODO - mobile support
// [JSManager] Load JS Includes - Zone 1 - Before Library
@@ -284,9 +295,8 @@ e107::getJs()->renderJs('header', 1);
e107::getJs()->renderJs('header_inline', 1);
// Send Javascript Libraries ALWAYS (for now)
//FIXME: [JS Manager] - build URL, disable core JS, option to use external sources (google)
$hash = md5(serialize(varset($pref['e_jslib'])).serialize(varset($THEME_JSLIB)).THEME.e_LANGUAGE.ADMIN).'_front';
echo "<script type='text/javascript' src='".e_FILE_ABS."e_jslib.php?{$hash}'></script>\n";
$jslib = e107::getObject('e_jslib', null, e_HANDLER.'jslib_handler.php');
$jslib->renderHeader('front', false);
// [JSManager] Load JS Includes - Zone 2 - After Library
e107::getJs()->renderJs('header', 2);
@@ -329,13 +339,13 @@ else
// TODO - convert it to e107::getJs()->header/footerFile() call
if (!USER && ($pref['user_tracking'] == "session") && varset($pref['password_CHAP'],0))
{
if ($pref['password_CHAP'] == 2)
{
if ($pref['password_CHAP'] == 2)
{
// *** Add in the code to swap the display tags
$js_body_onload[] = "expandit('loginmenuchap','nologinmenuchap');";
}
echo "<script type='text/javascript' src='".e_FILE_ABS."chap_script.js'></script>\n";
$js_body_onload[] = "getChallenge();";
$js_body_onload[] = "expandit('loginmenuchap','nologinmenuchap');";
}
echo "<script type='text/javascript' src='".e_FILE_ABS."chap_script.js'></script>\n";
$js_body_onload[] = "getChallenge();";
}
//headerjs moved below
@@ -343,15 +353,15 @@ if (!USER && ($pref['user_tracking'] == "session") && varset($pref['password_CHA
// Deprecated function finally removed
//if(function_exists('core_head')){ echo core_head(); }
// [JSManager] Load JS Includes - Zone 3 - After e_plug/theme.js, before e_meta and headerjs()
// [JSManager] Load JS Includes - Zone 3 - After e_plug/theme.js, before headerjs()
e107::getJs()->renderJs('header', 3);
e107::getJs()->renderJs('header_inline', 3);
// [JSManager] Load JS Includes - Zone 4 - Just before e_meta, after headerjs
// [JSManager] Load JS Includes - Zone 4 - After headerjs
e107::getJs()->renderJs('header', 4);
e107::getJs()->renderJs('header_inline', 4);
// [JSManager] Load JS Includes - Zone 5 - After headerjs, just before e_meta, e107:loaded trigger
// [JSManager] Load JS Includes - Zone 5 - End of header JS, just before e_meta content and e107:loaded trigger
e107::getJs()->renderJs('header', 5);
e107::getJs()->renderJs('header_inline', 5);
@@ -359,17 +369,8 @@ e107::getJs()->renderJs('header_inline', 5);
// F: Send Meta Tags, Icon links
//
// --- Load plugin Meta files --------
if (is_array($pref['e_meta_list']))
{
foreach($pref['e_meta_list'] as $val)
{
if(is_readable(e_PLUGIN.$val."/e_meta.php"))
{
require_once(e_PLUGIN.$val."/e_meta.php");
}
}
}
// --- Send plugin Meta --------
echo $e_meta_content; // e_meta already loaded
//
// G: Send Theme Headers