2010-02-24 181 views
0

這是一個奇怪的。我正在緩慢地在現場服務器上重建網站。該網站的某些部分已被重建,因此代碼被放置在主目錄的子目錄中(即:/ mysite/newcode)。爲什麼gzip壓縮不起作用?

我已經使用ob_start(「ob_gzhandler」)成功地對舊網站進行了gzip壓縮;所以,我已經爲新代碼應用了完全相同的代碼。然而,由於某種奇怪的原因,它的返回沒有被壓縮。我檢查了http://www.whatsmyip.org/http_compression/http://www.gidnetwork.com/tools/gzip-test.php。我不明白爲什麼如果gzip處理程序被包含在舊代碼和新代碼中的第一行之前(任何輸出之前),爲什麼它不會對新代碼進行gzip處理。

PHP 5.1.6 的Apache 2.0 CentOS 5的

+1

你在哪兒叫'ob_start'? – Gumbo 2010-02-24 09:15:50

回答

0

如果使用ob_start測試這才發現出了問題,不知道是否記錄任何地方......

( 「ob_gzhandler」);和你什麼刷新你的內容,你必須使用ob_flush(),而不是flush()。使用flush會拋出壓縮。

+0

一旦你完成了輸出,你應該使用ob_end_flush()或ob_end_clean() – stillstanding 2010-02-24 10:34:48

+0

請注意,我問爲什麼? – David 2010-02-25 09:11:00

+0

我認爲對PHP文檔的評論很好解釋。 http://php.net/manual/en/function.ob-end-flush.php你可以把它放在一個簡單的網頁請求場景中,它會自動調用。但是PHP和這些函數可以用於其他場景。此外,如果您決定在將來重新使用您的代碼,如果您尚未手動清理,則更有可能遇到問題。 – Liam 2010-06-04 17:02:58

1

http://docs.php.net/ob_gzhandler說:

ob_gzhandler()之前實際發送壓縮數據,它決定什麼類型的編碼器會接受( 「壓縮」 的內容, 「放氣」或者根本沒有)並且將相應地返回其輸出。
這可能是你的問題的原因?

編輯:你可以像

function dbg_ob_gzhandler($buffer, $mode) { 
    error_log('dbg_ob_gzhandler invoked'); 
    $rv = ob_gzhandler($buffer, $mode); 
    if (false===$rv) { 
    error_log('client does not support compressed content'); 
    } 
    return $rv; 
} 
ob_start('dbg_ob_gzhandler'); 
+0

我已經檢查過Live HTTP Headers(在Firefox 3.6中),並且即時將'Accept-Encoding:gzip,deflate'傳遞給服務器。所以肯定它應該返回壓縮信息。但是,它似乎唯一被壓縮的是一個隨機的css文件。 – David 2010-02-24 09:36:34

+0

我寧願測試一下,不管是否在服務器端調用ob_gzhandler()(如果僅僅因爲它是如此簡單的測試)。 – VolkerK 2010-02-24 09:45:49