4

状況

私は自分の Web サイト用に開発されたキャッシュを持っています。現在、各ページ要求をチェックして、ページの静的なキャッシュ バージョンがあるかどうかを確認し、ブラウザーがサポートされている場合は、ページを gzip してブラウザーに返します。

現在のコード

$hash = md5('http://mydomain.com'.$url);
$fl = substr($url, 1, 1);
if(file_exists('/home/myaccount/public_html/cache/'.$fl.'/'.$hash.'.html') && $_GET['cache'] != 'off' && $fl!=''):
    ob_start("ob_gzhandler");
    header('Content-type: text/html; charset=utf-8');
    include 'cache/'.$fl.'/'.$hash.'.html';
elseif(file_exists('/home/myaccount/public_html/cache/'.$hash.'.html') && $_GET['cache'] != 'off'):
    ob_start("ob_gzhandler");
    header('Content-type: text/html; charset=utf-8');
    include 'cache/'.$hash.'.html';
else:
    $_SERVER['REQUEST_URI'] = str_replace('?cache=off','',$_SERVER['REQUEST_URI']);
    include 'interface/index.php'; 
endif;

望ましい変化

サーバー上のファイルが既にgzipされているように変更したいと思います。ファイルをgzipしてサーバーに設定する方法はすでに知っています。ただし、スクリプトのこの部分を変更して、ブラウザーで gzip がサポートされているかどうかを確認し、gzip で圧縮されたバージョンのファイルを渡すようにする方法を知りたいです。サポートされていない場合は、gzip を解凍してサーバーに返します。

目的

これにより、いくつかのことが達成されます。まず、ファイルを保存するためにサーバー上で使用するスペースが少なくなります。次に、ほとんどのブラウザーが gzip 形式を受け入れるため、ページ要求ごとに gzip する必要がないため、時間を数ミリ秒短縮できます。代わりに、サポートされていないごく少数のブラウザーのファイルを解凍するだけで済みます。3 つ目は、php が gzip 圧縮されたファイルを処理する方法について詳しく学ぶ機会です。

4

2 に答える 2

1

答えを導き出すことができました。興味のある方はこちら:

$hash = md5('http://mydomain.com'.$url);
$fl = substr($url, 1, 1);
if(file_exists('/home/myaccount/public_html/cache/'.$fl.'/'.$hash.'.html.gz') && $_GET['cache'] != 'off' && $fl!=''):
    if (strstr($HTTP_SERVER_VARS['HTTP_ACCEPT_ENCODING'], "gzip")):
        header("X-Compression: gzip");
        header("Content-Encoding: gzip");
        readfile('cache/'.$fl.'/'.$hash.'.html.gz');
    else:
        $gz = gzopen ('cache/'.$fl.'/'.$hash.'.html.gz', "r");
        $contents = gzread ($gz, 1000000);
        echo $contents;
    endif;
elseif(file_exists('/home/myaccount/public_html/cache/'.$hash.'.html.gz') && $_GET['cache'] != 'off'):
    if (strstr($HTTP_SERVER_VARS['HTTP_ACCEPT_ENCODING'], "gzip")):
        header("X-Compression: gzip");
        header("Content-Encoding: gzip");
        readfile('cache/'.$hash.'.html.gz');
    else:
        $gz = gzopen ('cache/'.$hash.'.html.gz', "r");
        $contents = gzread ($gz, 1000000);
        echo $contents;
    endif;
else:
    $_SERVER['REQUEST_URI'] = str_replace('?cache=off','',$_SERVER['REQUEST_URI']);
    include 'interface/index.php'; 
endif;
于 2012-09-22T01:43:04.000 に答える
0

このことを php で実装するのに十分な 3 番目の理由しかないと思いますが、その場合は自分で解決策を見つける必要があります。

最初の 2 つの理由について、Apache には 2 つのオプションがあります。

  • mod_negotiationを使用して、圧縮されていないバージョンの代わりに事前に gzip されたファイルをサポートしているクライアントに送信できます。
  • mod_deflateは、圧縮転送エンコーディングをサポートしていないクライアントの出力ストリームを圧縮解除 (インフレート) するために使用できます。
于 2012-09-22T01:03:23.603 に答える