1

プライベート リバース プロキシ (Squid) に対して PHP スクリプトをキャッシュ フレンドリーにするにはどうすればよいですか?

残りの時間はキャッシュしたままにしておきたいです。つまり、ページの最終変更は今日の 00:00 で、明日の 00:00 に期限切れになります。

これを確実に行うために最低限必要な HTTP ヘッダーは何ですか?

編集:クライアントのブラウザに別の方法でキャッシュさせたくありません。つまり、Squid サーバー上の古いページをいつでもパージする制御を保持したいと考えています。

4

4 に答える 4

3

@OP: 以下は、あなたが求めたことを達成するためのコメント付きのコードです。

@cletus:memcachedはOPが望んでいるものであり、これはSquidが設計されたものではないと言いました。

Squid が何のために設計されたのかはわかりませんが、それ何のために使用されているかは知っています。また、動的ページ生成の負荷を軽減するためにリバース プロキシとして使用している人が確実にいます。標準の HTTP ヘッダーを除いて、「結合」は必要ありません。

アプリケーションと環境の性質について詳しく知らずに memcached をすぐに推奨する理由がわかりません。

<?php

// the time we got hit and generated content
$now = time();
$generatedAt = gmdate('D, d M Y H:i:s T', $now);

// the last modified date (midnight on the same day of generation, as
// per your business-rule)
$lastModified = gmdate('D, d M Y 00:00:00 T', $now);

// date of expiry (24 hours after the last modified date, as per your
// business-rule)
$expiresAt = gmdate('D, d M Y H:i:s T', strtotime($lastModified) + 86400);

// the minimum required http headers to make Squid do what you asked is
// Last-modified and Cache-control.  We need to give Cache-control the
// expiry time in terms of "age" (in seconds) so we calculate that below.
// Optionally you could also provide the "Expires: $expiresAt" header to
// tell the browser/client the same information, just in a different way.
// This is not required for Squid though.
$maxAge = strtotime($expiresAt) - strtotime($generatedAt);
header('Last-modified: ' . $lastModified);
header('Cache-control: max-age=' . $maxAge);

// The rest is simply informational
header('Content-type: text/plain');
echo "The content of this page was last modified at $lastModified\n";
echo "This page was generated at $generatedAt and will be cached by Squid for $maxAge seconds until $expiresAt\n";

// Sample output:
//
// The content of this page was last modified at Tue, 13 Jan 2009 00:00:00 GMT
// This page was generated at Tue, 13 Jan 2009 04:29:33 GMT and will be cached by Squid for 70227 seconds until Wed, 14 Jan 2009 00:00:00 GMT
于 2009-01-13T04:30:28.353 に答える
1

スクリプト自体ではなく、スクリプトの出力をキャッシュしたいという意味だと思います。そして、明らかにサーバー側のスクリプトが必要なので、HTTP ヘッダーは必要なものではありません (Squid との結びつきがある場合を除きます)。しかし、これは Squid が設計された目的ではありません。

この種のことについては、本当にmemcached (または同様のもの) が必要です。

結果がキャッシュにあるかどうかを確認します。もしそうなら、それを返します。そうでない場合は、(ob_start() などを使用して) 結果を生成し、キャッシュに入れて返します。

于 2009-01-13T02:27:22.957 に答える
0

APC を使用してみましたか?

http://us.php.net/apc

Alternative PHP Cache (APC) は、無料でオープンな PHP 用のオペコード キャッシュです。これは、PHP 中間コードをキャッシュおよび最適化するための無料でオープンで堅牢なフレームワークを提供するために考案されました。

于 2009-03-23T15:17:09.687 に答える