Сайт PHP / MySQL с использованием кэширования.Что делает эту работу большую часть времени? - PullRequest
4 голосов
/ 21 марта 2012

Наш предыдущий веб-мастер настраивал этот сайт, и кеширование, которое он настраивал, прекрасно работает для большинства браузеров, но я обнаружил, что некоторые версии Opera не работают, а некоторые онлайн-инструменты SEO, такие как Submit Express Analyzer . Я подозреваю, что это проблема с заголовками. Я читал об ob_start ("ob_gzhandler"), но я не уверен, как я могу реализовать его в этом сценарии.

Сайт полностью управляется файлом маршрутизатора, уникальными файлами контроллера для каждого типа страницы и .htaccess. В файле маршрутизатора приведенный ниже код установлен для поиска кэшированной версии страницы и загрузки содержимого, в противном случае загрузите страницу.

Кэширование сжимает содержимое страницы с помощью gzencode и сохраняет его в базе данных в кеш-таблице с хешем uri. Если кэшированный файл существует, содержимое извлекается из базы данных.

Opera отображает пустую страницу, а экспресс-тест Submit не распознает страницу. Я почти уверен, что файл .htaccess не имеет ничего общего с проблемой. Код ниже, где я думаю, проблема заключается в *. 1009 *

<?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(); 
}
}

В этом файле много чего происходит, и я постарался вырезать как можно больше материала, чтобы избежать путаницы. Любая помощь, безусловно, высоко ценится! Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 22 марта 2012

Хорошо, это выглядит противно.

Во-первых, обработка ошибок ужасна - проглатывание ошибок, подобных этой, в разделе кода, который вызывается на каждой странице, отстой.

Во-вторых, большинство веб-серверов будут обрабатывать 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;
    }
}
0 голосов
/ 21 марта 2012

Существуют всевозможные факторы, но в большинстве случаев это лишний мусор в сжатой версии, который отправляется в браузеры, и некоторые не могут развернуть страницу с этим материалом в них.

Обычно есть только несколько дополнительных строк вверху, E_NOTICES (используйте error_repoting(0); для подавления) и, возможно, даже кодировка, используемая внутри таблиц хранения.Помимо этого, это может быть просто устаревшее расширение для сжатия PHP, и Opera использует этот метод.

Я не уверен, что file_get_contents('...') получает версию gzipped, но если нет, откройте сайт.в Opera и используйте что-то вроде WireShark, чтобы точно увидеть, что получает браузер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...