2012-03-21 27 views
4

我們以前的網站管理員建立這個網站,緩存他樹立優良的大多數瀏覽器的作品,但我發現,歌劇的一些版本不工作,一些在線SEO工具,如Submit Express Analyzer。我懷疑這是頭文件的問題。我已閱讀關於ob_start(「ob_gzhandler」),但我不知道如何在這種情況下實現它。使用緩存的PHP/MySQL網站。大部分時間是什麼使這項工作成爲可能?

該網站全部由路由器文件,獨特的控制器文件爲每種類型的頁和的.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(); 
} 
} 

有很多在這個文件怎麼回事,我試圖切出儘可能多的東西,儘可能地消除混淆。任何幫助顯然非常感謝!提前致謝!

+0

你會考慮提供一個鏈接,在其他瀏覽器中顯示好,但在Opera中失敗嗎? – 2012-03-21 17:16:02

+0

對不起,我不能......保密的原因。 – NotJay 2012-03-21 17:20:28

+0

Welp,這很可能是一個HTTP錯誤。一些HTTP客戶端(瀏覽器)比其他客戶更寬容。 – 2012-03-21 17:35:42

回答

0

好的,這個看起來很討厭。

首先,錯誤處理是可怕的 - 吞嚥時調用在每一頁上吮吸代碼段類似的錯誤。

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

有各種各樣的因素,但大部分的時間,如果在這會被髮送到瀏覽器和一些不能在他們的東西展開的頁面壓縮版本額外的碎片。

通常頂部只有一些額外的行,E_NOTICES(使用error_repoting(0);來抑制),甚至可能在存儲表中使用編碼。除此之外,它可能只是PHP的過時壓縮擴展,Opera使用這種方法。

我不確定file_get_contents('...')是否會檢索gzip版本,但如果沒有,請在Opera中打開該網站並使用類似WireShark的內容來查看瀏覽器收到的內容。

相關問題