3

私が取り組んでいる Web アプリケーションを最適化するためのいくつかの戦略、特に Web ブラウザーのキャッシングと動的データに関連するものを研究してきました。同じ動的コンテンツがセッションで複数回読み込まれる可能性があるため、PHP の出力バッファーを使用し、コンテンツのハッシュを ETag として使用する次の方法を考え出しました。

PHPスクリプトを完全に実行する必要があるため、この方法で本当に節約できるのは、データをユーザーに転送することだけです知っておくべきか、他の方法がより良いかもしれません。

各ページの上部に含めているコードは次のとおりです。

<?php
function hash_buffer($content) {
    $buffer_hash = crc32($content);
    if ($_SERVER['HTTP_IF_NONE_MATCH'] == $buffer_hash) {
        header('HTTP/1.1 304 Not Modified');
        header("ETag: $buffer_hash");
        return '';
    }
    header('Cache-Control: private, no-cache');
    header("ETag: $buffer_hash");
    return $content;
}

ob_start('hash_buffer');
?>
4

1 に答える 1

0

高速なものを使用してハッシュを作成します。crc32 は高速ですが、md5 よりも多くの衝突が発生する可能性があります (ただし、ファイル名がいくつか処理します)。

<?php
function hash_buffer($content) {
    $buffer_hash = crc32($content);

    // You could add expire time so the check is not made every time.
    // Or force it to happen always
    header('Expires:');//.date('r',strtotime('+1 hour')));

    // Add vary header so client knows to usee ETag
    // Without overwriting existing vary headers
    header('Vary: If-None-Match',false);

    if ($_SERVER['HTTP_IF_NONE_MATCH'] == $buffer_hash) {
        header('HTTP/1.1 304 Not Modified');
        header("ETag: $buffer_hash");
        return '';
    }
    header('Cache-Control: private, no-cache');
    header("ETag: $buffer_hash");
    return $content;
}

ob_start('hash_buffer');
?>

バッファへのコンテンツの取得を高速化する

バッファリングされたコンテンツをより高速に生成するには、ファイル キャッシュを使用できます。たとえば、生成されたナビゲーション/ブログロール/ニュースリストをファイルに書き込み、filemtime がキャッシュの有効期間 (10 分 - 1 時間など) 内にある場合はそこから読み取ります。それ以外の場合は、ファイルに書き留めて通常どおり処理します。

衝突などを防ぐために書き込みロックが必要です。そのhttps://github.com/zendframework/zf2/blob/master/library/Zend/Cache/Storage/Adapter/Filesystem.php#L1489の ZendFramework 実装を参照してください。

覚えて

ユーザー権限は、チェックアウトページなどに他の誰かのショッピングカートを表示させたくないキャッシュのように、ファイルキャッシングに関与する可能性があります。一般に、認証されたユーザーをファイルキャッシュから除外することは安全です。

ファイルにキャッシュする場合、キャッシュ ファイルは、Web などを介したパブリックな読み取りおよび書き込みアクセスから保護する必要があります。

于 2013-08-07T10:39:47.743 に答える