【问题标题】:PHP / MySQL site using caching. What makes this work most of the time?PHP/MySQL 站点使用缓存。是什么让这项工作大部分时间都有效?
【发布时间】:2012-03-21 16:40:32
【问题描述】:

我们以前的网站管理员设置了这个网站,他设置的缓存适用于大多数浏览器,但我发现某些版本的 Opera 和一些在线 SEO 工具(如 Submit Express Analyzer)不起作用。我怀疑这是标题的问题。我已经阅读过有关 ob_start("ob_gzhandler") 的信息,但我不确定如何在这种情况下实现它。

站点全部由路由器文件、每种页面类型的唯一控制器文件和 .htaccess 控制。在路由器文件中,设置了以下代码以查找页面的缓存版本并加载内容,否则,加载页面。

缓存使用 gzencode 压缩页面内容,并使用 uri 哈希将其存储在数据库中的缓存表中。如果缓存文件存在,则从数据库中提取内容。

Opera 显示一个空白页面,并且提交快速测试无法识别页面。我几乎可以肯定 .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(); 
}
}

这个文件中发生了很多事情,我试图删掉尽可能多的内容以消除混乱。任何帮助显然都非常感谢!提前致谢!

【问题讨论】:

  • 您是否考虑提供一个在其他浏览器中显示正常但在 Opera 中失败的链接?
  • 抱歉,我不能……出于保密原因。
  • Welp,这很可能是 HTTP 错误。一些 HTTP 客户端(浏览器)比其他客户端更宽容。
  • 我刚刚看到大部分代码都是基于php.net上的一个示例

标签: php mysql caching gzip


【解决方案1】:

好吧,这个看起来很糟糕。

首先,错误处理非常糟糕——在每个页面都调用的代码部分中吞下这样的错误很糟糕。

其次,大多数 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;
    }
}

【讨论】:

    【解决方案2】:

    有各种各样的因素,但大多数情况下,如果压缩版本中有额外的碎片被发送到浏览器,并且有些无法展开包含这些内容的页面。

    通常在顶部只有一些额外的行,E_NOTICES(使用error_repoting(0); 来抑制),甚至可能是存储表中使用的编码。除此之外,它可能只是 PHP 过时的压缩扩展,Opera 使用了这种方法。

    我不确定file_get_contents('...') 是否检索到 gzip 压缩版本,但如果没有,请在 Opera 中打开该站点并使用 WireShark 之类的工具查看浏览器接收到的确切内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 2023-03-27
      • 1970-01-01
      • 2014-05-26
      相关资源
      最近更新 更多