我们以前的网站管理员设置了这个网站,他设置的缓存适用于大多数浏览器,但我发现有些版本的Opera不起作用,还有一些在线SEO工具,如Submit Express Analyzer。我怀疑这是头的问题。我读过关于ob_start("ob_gzhandler")的文章,但我不确定如何在这种情况下实现它。
该网站全部由路由器文件、每种类型的页面的唯一控制器文件和.htaccess控制。在路由器文件中,下面的代码被设置为查找页面的缓存版本并加载内容,否则加载页面。
缓存使用gzencode压缩页面内容,并使用uri哈希将其存储在数据库中的缓存表中。如果缓存的文件存在,则会从数据库中提取内容。
Opera显示一个空白页面,而Submit Express Test无法识别页面。我几乎可以肯定.htaccess文件与这个问题无关。下面的代码是我认为问题所在的地方。
<?php
$loadTime = microtime(true);
session_start();
if (!isset($_SESSION['var']))
$_SESSION['var'] = rand(0, 2);
if (!isset($_SESSION['var2']))
$_SESSION['var2'] = rand(0, 4);
require(dirname(__FILE__).'/config/common.php');
$uri = $_SERVER['REQUEST_URI'];
$request = explode('/', substr($uri, 1));
$request = preg_replace('/..*/', '', $request);
$uriHash = sha1($uri);
if($uri == '/') //This is the Index...
{
无关索引代码
}
try
{ // LOOKS FOR CACHE IN DB BASED ON URI
$cache = $GLOBALS['db']->getRow("SELECT * FROM cache_tbl WHERE uri_hash = '$uriHash'");
}catch ( Exception $e ) {
$cache = array();
}
if ( !empty($cache) && ($cache['mod_date'] * 60 * 60 * 24) > $loadTime )
{ // IF NO CACHE IN DB, SETS HEADERS FOR COMPRESS OR NO COMPRESS
$HTTP_ACCEPT_ENCODING = $_SERVER["HTTP_ACCEPT_ENCODING"];
if( headers_sent() )
$encoding = false;
else if( strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false )
$encoding = 'x-gzip';
else if( strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false )
$encoding = 'gzip';
else
$encoding = false;
$compressed = $cache['contents'];
if ( $encoding ) {
header("Content-Encoding: ".$encoding);
echo $compressed;
}
} else {
if ($request[0] == 'venues') {
header("HTTP/1.1 301 Moved Permanently");
header('Location: '.HOST.$request[1].'.html');
}
更多代码
if ( // Irrelevant Conditions ) {
$contents = ob_get_clean();
echo $contents;
$compressed = gzencode($contents, 7);
try {
Admin::add('cache_tbl', array('uri_hash' => $uriHash, 'contents' => $compressed, 'mod_date' => $loadTime));
} catch(Exception $e) { ; }
ob_end_flush();
}
}
这个文件里有很多内容,我试着删掉尽可能多的内容来消除混乱。非常感谢您的帮助!提前感谢!
好吧,这个看起来很恶心。
首先,错误处理非常糟糕——在每个页面上调用的代码段中包含这样的错误非常糟糕。
其次,大多数web服务器都会开箱即用地处理GZIP等——真的没有理由自己发明。
第三,这可能是因为你分割代码的方式,但我认为在下面的"IF"块中,如果当前浏览器不接受压缩内容,就没有理由回显内容。
if ( !empty($cache) && ($cache['mod_date'] * 60 * 60 * 24) > $loadTime )
{ // IF NO CACHE IN DB, SETS HEADERS FOR COMPRESS OR NO COMPRESS
$HTTP_ACCEPT_ENCODING = $_SERVER["HTTP_ACCEPT_ENCODING"];
if( headers_sent() )
$encoding = false;
else if( strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false )
$encoding = 'x-gzip';
else if( strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false )
$encoding = 'gzip';
else
$encoding = false;
$compressed = $cache['contents'];
if ( $encoding ) {
header("Content-Encoding: ".$encoding);
echo $compressed;
}
}
有各种各样的因素,但大多数时候,如果压缩版本中有多余的碎片被发送到浏览器,有些人无法打开包含这些东西的页面。
通常在顶部只有一些额外的行,E_NOTICES(使用error_repoting(0);
来抑制),甚至可能还有存储表内部使用的编码。除此之外,它可能只是过时的PHP压缩扩展,Opera使用了这种方法。
我不确定file_get_contents('...')
是否检索到gzipped版本,但如果没有,请在Opera中打开网站,并使用WireShark之类的工具来查看浏览器接收到的内容。