テンプレート エンジンとして smarty を使用すると、YSlow (Firefox アドオン) から Etag フラグが「F」であると報告されますが、smarty を使用しています。smarty で Etag を使用するにはどうすればよいですか。メインの tpl は Framework.tpl で、他のすべてのテンプレートがそれに割り当てられます
3 に答える
ページに ETag が実際に必要であると判断した場合(これは、やや恣意的なテストに合格するためだけに ETag を実装するのとは異なります)、私はこの (古い) スクリプトで良い経験をしました: http://simonwillison.net/2003/ 04/23/条件付Get/
Smarty はページ テンプレートを扱うため、これは Smarty 固有のものではないことに注意してください。この「条件付きリクエスト」ビジネス全体 (ETag や Last-Modified などを使用) は HTTPヘッダーで発生するため、上記のコードは単純な PHP です。
リソースの最終変更時刻 (ファイルの変更とは異なる場合があります。たとえば、データベースの関連部分が最後に変更されたのはいつですか?) を特定し、それを に渡す必要がdoConditionalGet($timestamp)
あります。その後、304 を送信して終了するか、返されます (つまり、条件付きの要求がなかったかのように、ページ全体の処理を行う必要があります)。
単にディレクティブ
FileETag None
.htaccess ファイルで ETag ヘッダー フィールドを無効にします。YSlow はもう文句を言いません... :)
Smarty で出力フィルターを使用できます。ETag ging用のすぐに使用できるコードの下には、次のようなものがあります。
function etag_handler($output)
{
$etag = md5($output);
header('ETag: '.$etag);
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && strpos($_SERVER['HTTP_IF_NONE_MATCH'], $etag) !== FALSE)
{
header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified');
return '';
}
return $output;
}
$smarty->registerFilter('output', 'etag_handler');
それを の前のどこかに置いてください$smarty->display(...);
。
このコードを使用しても、サーバーは引き続き出力を計算しますが、クライアントが既に同じ回答を持っている場合、サーバーはそれを再度送信しないため、ネットワーク トラフィックを節約するだけであることに注意してください。サーバーの計算能力を節約したい場合は、別のこと (キャッシング) を行う必要がありますが、ETagging と組み合わせることができます。