[PHP-users 3055] Re: phpでのキャッシュの有効期限について

Yasuo Ohgaki php-users@php.gr.jp
Wed, 24 Oct 2001 10:21:52 +0900


大垣です。

IE6をインストールしたら、ドキュメントの有効期限の取り扱いが多少変
わった様なので、ちょうどいろいろ試していました。

# IE6の動作に関する技術情報で良いURLがある場合は教えてください。

hasegawa wrote:

> はじめまして、長谷川と申します。
> 
> 基本的なところなのかもしれませんが、切り分けがうまくできず
> 悩んでいます。
> 判る範囲で構いませんので、アドバイスをお願いします。
> 
> ■環境
>   ●サーバ
>      Linux (Miracle Linux STD 1.0)
>      Apache 1.3.19
>      PHP    4.0.6
>   ●クライアント
>      Windows98SE
>      InternetExplorer 5.0
>      NetScape 4.75
> 
> ■現象説明  
> 
>   ラジオボタン、プルダウンメニューが入ったページを作成している
>   がform画面のプルダウンなどの色々な値を変更させてリサイズ
>   キャッシュの制御に<META>タグの設定は行なわず、ブラウザのデフ
>   ォルト(セッション毎)で確認


私も、METAで色々設定するのはちょっと難ありと思います。本来のHTTP
Headerで調整すべき事なので。(両方使ったりしていますが、、)

> 
>  ●Netscape4.75の現象
>      ・変更させた値が、全て初期の状態に戻る。
>      ・「ページ情報の表示」の有効期限:11/19/81 17:52:00と過去
>   ●InternetExplorer5.0では
>      ・ 問題なく、選択状態のまま表示される。
>      ・「ページ情報の表示」の有効期限:「日付けなし」
> 
>  上記は、PHPでHTMLを出力しないで、htmlファイルとして読みこんだ
>  場合には、有効期限が「日付なし」になり、リサイズしても変更させた
>  値を覚えている。


PHP4 Sessionを利用している前提で返信します。
session.cのソース(4.1.0RC CVS)ですが、以下の部分でヘッダーを生成し
ています。public以外の場合は過去の日付のExpiresヘッダーを送信します。

# この手の問題はヘッダーも簡単にみれる、wget, curl等を利用
# した方が簡単です。

CACHE_LIMITER_FUNC(public)
{
	char buf[MAX_STR + 1];
	time_t now;
	
	time(&now);
	now += PS(cache_expire) * 60;
#define EXPIRES "Expires: "
	memcpy(buf, EXPIRES, sizeof(EXPIRES) - 1);
	strcpy_gmt(buf + sizeof(EXPIRES) - 1, &now);
	ADD_COOKIE(buf);
	
	sprintf(buf, "Cache-Control: public, max-age=%ld", PS(cache_expire)
* 60);
	ADD_COOKIE(buf);
	
	last_modified(TSRMLS_C);
}
	
CACHE_LIMITER_FUNC(private)
{
	char buf[MAX_STR + 1];
	
	ADD_COOKIE("Expires: Thu, 19 Nov 1981 08:52:00 GMT");
	sprintf(buf, "Cache-Control: private, max-age=%ld, pre-check=%ld",
PS(cache_expire) * 60, PS(cache_expire) * 60);
	ADD_COOKIE(buf);

	last_modified(TSRMLS_C);
}

CACHE_LIMITER_FUNC(nocache)
{
	ADD_COOKIE("Expires: Thu, 19 Nov 1981 08:52:00 GMT");
	/* For HTTP/1.1 conforming clients and the rest (MSIE 5) */
	ADD_COOKIE("Cache-Control: no-store, no-cache, must-revalidate,
post-check=0, pre-check=0");
	/* For HTTP/1.0 conforming clients */
	ADD_COOKIE("Pragma: no-cache");
}

> 
> ■質問事項
> 
>  ・PHPで作成したページをhtml形式のように有効期限「日付なし」にする事
>   可能でしょうか?


「日付なし」にできないか?と言うことでしょうか? (NN 4.7のページ情報
ですよね?) Expiresヘッダーを送らなければ、日付無しになると思います。

Expiresヘッダーの問題であれば、session_cache_limitter()を読んだ後
に、Expiresヘッダーを送り直せば、新しいExpiresヘッダーのみ送ってく
れます。

Expiresヘッダーを完全に消すためにはcache limitterに"none"等の無効
な値をいれておくとヘッダーを送りません。cache limitterも使う場合
は、session_cache_limitter()を読んだ後、各ヘッダーを上書きするとよ
いです。

# sessionモジュールでヘッダーを送ったかどうか状態を管理
# しているので、cache limtterが呼ばれてから、ヘッダーを
# 変更しないと上書きされます。

RFC2616(とHTTP1.0等の古いRFCも)を読んでみてはどうでしょうか?

>  ・または、HTMLのようにリサイズしても変更した値を覚えているようにする
>   事は可能でしょうか?
 

JavaScriptでリロードした場合は普通の状態ではフォームのデータは消え
てしまいます。リサイズしてフォームデータがリセットされるのはブラウ
ザがリロードしているのでは無いか、と推測します。(古いNNにはリサイ
ズ時の問題があったので、対 処策?)

持ち回すことは可能です。データ量が少ないようであれば、Query String
でデータを持ち回すとクライアントのみで完結します。サーバーに
POST/GETでフォームのデータを送って、再表示と言う方法の方が無難かも
しれません。

--
Yasuo Ohgaki
yohgaki@dd.iij4u.or.jp



__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!  http://bb.yahoo.co.jp/