スレッド一覧 > 記事閲覧
[148] 戻る・進むボタンを押した時のみキャッシュしたい
日時: 2021/03/13 01:48
名前: 匿名 ID:7KIlZSF2 メールを送信する
参照: https://sinst.ie-t.net/

非常にありがたいサービスに感謝します。
1つ、解決したい問題があります:

例えば a.html と a.php があり、
a.html から a.php へのリンクが貼られているとします。
そして、a.php はアクセスすると mt_rand 等でランダムな数値を表示するものとします。ランダムのため、F5キーなどでリロードするとそのたびに違う数値を表示します。

この時、例えば初めてa.htmlにアクセスした人がリンクをクリックし、
a.phpが初めて実行されて「43」と表示されたとします。

その後、ブラウザの「戻る」ボタンを押してa.htmlに戻ります。
問題はここからです。

次に再度リンクをクリックしてa.phpにアクセスすると、
再びa.phpが実行され、今度は「43」以外の数値(例えば「125」)が表示されるのを期待します。
一方、リンククリックではなく、ブラウザの「進む」ボタンにて再度a.phpを表示した時は、キャッシュから読み込まれて再び「43」が表示される事を期待します。

しかし、実際には「進む」ボタンのみならず、リンクをクリックした時にもキャッシュが読み込まれてしまい、
どんなにクリックしても「43」が表示され続けてしまうのです。
F5キーを押さない限り、これを別の数値にすることはできませんでした。
つまり、PHPの実行結果のキャッシュが強すぎるのです。

そこで、Header set Cache-Control "no-store" などを設定し、
キャッシュを無効化する事を考えました。
そうすれば、リンククリック時に必ずa.phpが再実行されます。

しかし、それだと別の問題が起こります。
キャッシュを無効化してしまうと、
一度「戻る」ボタンでa.htmlに戻った後に
「進む」ボタンで再びa.phpを表示させた時にも、
強制的にa.phpが再実行されてしまうのです。
これでは、サイトアクセスが増えた時にサーバへの負荷がかかりすぎてしまいます。
「進む」ボタンの時はPHPを実行させずに、キャッシュから「43」が表示されて欲しいのです。

整理すると、
「進む/戻る」ボタンの時のみキャッシュから読み込み、
リンククリックとF5キーの時はPHPをしっかり実行するようにしたいのですが、
これを実現する設定があったり、
現状の挙動の原因となっている何かしらの設定項目があるのでしょうか。

私は、過去にこのような理想の動作が実現できたサーバ環境も経験したことがあるので、
設定次第で解決可能かもしれないと思い、知恵を募ります。

1つ、原因の候補かもしれないものとして、「ウェブアクセラレータ」というものを疑っています。
ネットで調べてみると、一部のサーバには「ウェブアクセラレータ」という機能を備えているものがあるらしく、これはブラウザ側が持つキャッシュとは別に、サーバ側がキャッシュを保持するもののようです。「ウェブアクセラレータをオフにしたら、キャッシュのおかしな挙動が直った」という体験談が見つかりました:
https://lpeg.info/webworks/cash_on.html
メンテ

(全部表示中) もどる スレッド一覧 新規スレッド作成

補足説明 ( No.1 )
日時: 2021/03/13 08:43
名前: 匿名 ID:7KIlZSF2 メールを送信する
参照: https://sinst.ie-t.net/a.html

追記:
昨晩間違えてトップページのURLを書いてしまったため、a.htmlへの検証用URLを貼ります。

追記2:
昨晩の「私は、過去にこのような理想の〜(中略)〜知恵を募ります。」の部分の表現が分かりにくかったので、補足します。以下の3点です。:

https://lpeg.info/webworks/cash_on.html
にて説明されている「ウェブアクセラレータ」という機能について、
もしかしたら、他サーバーと同様のこの機能がこちらのサーバーにもあり、それが原因でa.phpの奇妙なキャッシュ動作が起こっているのかもしれない点

・上記のサイトによると、他サーバーのコンパネには「ウェブアクセラレータ」機能をオンオフできるスイッチが用意されていることが多いようですが、もしもこちらのサーバーにも同様の機能があり、この機能が悪さをしていたとした場合、こちらのサーバーのコンパネにも同様のスイッチがあるかどうか

・それとも、そもそも「ウェブアクセラレータ」とは別の原因による場合、他にどのような原因が考えられるか
メンテ
補足2 ( No.2 )
日時: 2021/03/13 09:15
名前: 匿名 ID:7KIlZSF2 メールを送信する

連続投稿失礼します。

(ブラウザ側ではなく)サーバー側のキャッシュについて調べていると、
もしかしたら apache の httpd.conf にある
・EnableMMAP
・EnableSendfile
という2つの項目(ディレクティブ)がサーバーサイドキャッシュに関わっているようです。
(nginx.conf ならば sendfile : off; などのようです)

原因調査のため、まずこれらの項目が Off になっているかどうかの確認と、なっていなければ、Offにしてみる事の検討をしていただけると幸いです。これにはサーバソフトの再起動が必要らしいので、私にはいじれない項目かと思います。そのため、こちらのスレッドに調査結果が届くまでの間、暫く待ってみることにします。特に急かすつもりはないので、調査は無理のない範囲で大丈夫です。

不勉強ながらこれらの項目の存在をついさっき知ったため、補足情報の書き込みが遅れてしまい申し訳ございませんでした。
メンテ
お待ち下さい ( No.3 )
日時: 2021/03/13 22:42
名前: ちらみ◆kBt3KPJY0E ID:OHyW4cA2 メールを送信する

了解しました。
今月は本業の方でバタバタしてて今もシステム切替中なので落ち着いたら検討します。
メンテ
Re: お待ち下さい ( No.4 )
日時: 2021/03/14 11:26
名前: 匿名 ID:DeJq4FJ6 メールを送信する

早速のご返答ありがとうございます。了解しました。
とりあえず3月の間は、
サーバサイドキャッシュが動作上の問題になるPHPファイルのみ、 Header set Cache-Control "no-store" で仮対処しておこうと思います。
続報は4月以降、待つことにします。
メンテ
Re: 戻る・進むボタンを押した時のみキャッシュしたい ( No.5 )
日時: 2021/03/14 16:48
名前: ちらみ◆kBt3KPJY0E ID:pvPHy9XQ

仰るような症状になった覚えは無いのですが、取り急ぎApacheのグローバル設定にてご要望の設定としました。

# Defaults if commented: EnableMMAP On, EnableSendfile Off
#
EnableMMAP off
EnableSendfile Off

ちなみにこれまでは両方ともOnでした。
何故そうしたのかも覚えてないんですが

もし別の問題が発生した場合は元に戻して、お使いのドメイン部分のみを上記設定とします。
メンテ
Re: No.5 ( No.6 )
日時: 2021/03/14 22:05
名前: 匿名 ID:DeJq4FJ6 メールを送信する

なんと、お忙しい中の早速の設定変更、ありがとうございます…!
なるほど、Onだったのですね。

ただ、2021年3月14日21時58分現在も、
症状が続いているようなので、もしかしたらApacheの再起動がまだなされていないのかもしれません。
EnableMMAP off
EnableSendfile Off
調べてみると、これらの設定変更の反映には、Apacheの再起動が必要とのことです。

念のため、2021年3月14日21時58分現在、
自分のブラウザ側の不具合の可能性も考慮して、
自分の持っているパソコン上のChromeだけでなく、
・Firefox
・自分のAndroidスマホのChrome
・自分のiPhoneスマホのSafari、
・実家のパソコンのChrome
・自分のパソコンのChromeのシークレットモード
で再度検証してみましたが、
いずれも同じ症状が見られます。
つまり、まだ旧設定の状態が残っているようです。

※ちなみに、実はこのフォーラムのBBS自体にも同様の症状がありまして、返信が来たにもかかわらず返信前の状態が表示されるので、
右クリックで「フレームを再読み込み」をしてやらないと返信が表示されない状態のようです。

報告が度重なってしまい、すみません。
メンテ
再起動はしています ( No.7 )
日時: 2021/03/14 22:16
名前: ちらみ◆kBt3KPJY0E ID:pvPHy9XQ

Apacheは当然再起動しています。
ここの掲示板は確かにキャッシュされてしまいますが、これは特にChromeで顕著でiframeだからある適度仕方ないかなと諦めてます。
CGIに直接アクセスすれば大丈夫だと思います。

当サーバではmod_fcgidを使っているのでその辺も関係してるかもですが今はちょっと調べてる余裕がないです。
メンテ
Re: 再起動はしています ( No.8 )
日時: 2021/03/15 09:02
名前: 匿名 ID:DSq2XAVc メールを送信する

なるほど、当然再起動してますよね…失礼いたしました。
となると、原因は
EnableMMAP On
EnableSendfile On
だった点以外にもあるかもしれないのですね。
謎が深まりますね(´・ω・`)
ただ、
EnableMMAP Off
EnableSendfile Off
にする事ができただけでも大きな前進なので、
これまたお忙しい中にもかかわらずの調査、ありがとうございます。

mod_fcgid周りなど、その他の怪しい点の調査については
余裕が出来てからの無理のない範囲でも大丈夫です。
厄介なIssueを持ち込んでしまい、申し訳ない限りでもあります(´・ω・`)

今は.htaccessの "no-store" による仮対処で対応中ですが、
検証URLである https://sinst.ie-t.net/a.html には
"no-store"の影響が出ないように設定したので、
いつでもそこから検証できるようにしてあります。

掲示板についても了解です。
メンテ
【続報】解決しました!(Re: Re: 再起動はしています) ( No.9 )
日時: 2021/03/15 18:20
名前: 匿名 ID:8DK/kqdM メールを送信する

解決した可能性が濃厚な続報です:

Header set Cache-Control "no-store"
ではなく
Header set Cache-Control "max-age=0"
を指定すると、
望み通りの挙動になりました。

一応、
Header set Cache-Control "max-age=0" は既に昨日も試していましたが、昨日は効果が出なかったため、一時は無理かと思われました。
しかし、今日再び "max-age=0" を試してみると、なぜか効果があり、理想の挙動になりました。

おそらく、昨日と今日とで違うのは、EnableMMAP と EnableSendfile の状態です。
よって、今の所、

「EnableMMAP と EnableSendfile が Off になっていて、且つ、 "max-age=0" を指定すれば、理想通りの挙動になる」

という "仮説" が立っております。

たった今、自分のPCのChrome・自分のPCのFirefox・会社のPC・iPhoneのSafari・AndroidのChromeにて、解決を確認できました。
今となっては検証URLのみならず本番PHPも全て完全に理想の挙動となったため、事実上の解決と見て良いと思います。やはり、
EnableMMAP Off
EnableSendfile Off
を指定できた点が大きかったようです。対応していただき、本当にありがとうございました!
メンテ
mod_expires ( No.10 )
日時: 2021/03/15 18:47
名前: ちらみ◆kBt3KPJY0E ID:ndJwt45Q

検証ありがとうございます。

Apacheのmod_expiresが関係していそうなのでグローバル設定で下記の様にしてみました。
好みに応じて.htaccessで調整下さい。
あまりキャッシュさせなさ過ぎるのもサーバや回線負荷に繋がるので難しいところです。


■変更前
ExpiresActive On
ExpiresDefault "access plus 1 month"


■変更後
ExpiresActive On
# Default
ExpiresDefault "access plus 0 seconds"
# JavaScript
ExpiresByType text/js "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType application/x-javascript "access plus 1 month"
# CSS
ExpiresByType text/css "access plus 1 month"
# images
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
# Favicon and cursor images
ExpiresByType image/x-icon "access plus 1 month"
# PDF
ExpiresByType application/pdf "access plus 1 month"
# Fonts
ExpiresByType application/x-font-ttf "access plus 1 month"
ExpiresByType application/x-font-woff "access plus 1 month"
ExpiresByType application/x-font-opentype "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"


以上です。
メンテ
Re: mod_expires ( No.11 )
日時: 2021/03/15 23:41
名前: 匿名 ID:8DK/kqdM メールを送信する

グローバル設定の整備まで、ありがとうございます。
キャッシュは難しいテーマですよね。
(画像などは差し替え時に問題が起こった場合に .htaccess で調整するかもしれませんが、)基本的にはPHP以外については積極的にキャッシュしようと思っているので、このままの状態で運用してみます。
今回はどうもありがとうございました。(`・ω・´)


(※本題から逸れてしまい恐縮ですが、
PHPのバージョンがばれてしまう X-Powered-By ヘッダが送られる状態はセキュリティ上良くないとのことなので、
php.iniにて
expose_php=Off
を指定して、 X-Powered-By ヘッダ が送られないようにしておけると、なおありがたく思います!)
メンテ
対応しました ( No.12 )
日時: 2021/03/16 10:56
名前: ちらみ◆kBt3KPJY0E ID:utndJphk

ご報告ありがとうございます。

> expose_php=Off
対応しました。
メンテ
Re: 対応しました ( No.13 )
日時: 2021/03/16 19:46
名前: 匿名 ID:bYmRPoks メールを送信する

ありがとうございます、
X-Powered-By ヘッダ の消滅も無事確認もできました。
これで、全ての問題が解決しました。
この度は本当にありがとうございました!
メンテ

(全部表示中) もどる スレッド一覧 新規スレッド作成

題名
スレッドをトップへソート
名前
「名前#任意の文字列」でトリップ生成
E-Mail
入力するとスレッドの通知メールを受け取れます。(非表示)
URL
パスワード (記事メンテ時に使用)
投稿キー (投稿時 投稿キー を入力してください)
コメント

   クッキー保存