- 締切済み
キャッシュ問題
php,mysqlを使用した動的サイトなのですがdbの内容を更新してページでリロードしても情報が全く変わりません。 おおまかな流れではありますがアクセスの度にdbに接続しselectでデータを取得しています。 ブラウザから一時保存ファイルを消去してリロードしてやっとdbの内容が反映される状況です。 原因は明らかにキャッシュかと思うのですがどうすれば回避することはできますか? htmlには以下のタグを入れているのですが全く効果はないようです・・・ <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Cache-Control" content="no-cache, must-revalidate" /> <meta http-equiv="Expires" content="0" /> htmlの問題かphpの問題か微妙なラインなのですが回避方法としてアドバイス頂けますと幸いです。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
hogehoge.php?foo=ランダムな文字列 という動的なパラメータを発行してみてはどうでしょうか。 一応新規ページとして処理されるはずですが・・・
- hogehoge78
- ベストアンサー率80% (433/539)
http://ameblo.jp/only-human/entry-10093996311.html こちらのURLに記載のような、ExpireやLast-Modifiedのheaderも追加しても改善されませんか? 画像のリンクや、戻るリンクを実装されている場合には、ファイル名の最後にクエリキーワードを入れてやると回避できるようですが・・・ <img src="hoge.jpg">とあった場合は、 <img src="hoge.jpg?xxxxxxxx"> (xxxxxxxは毎回rand関数などで拾ったランダムな値) 同様にaタグでも <a href="index.php?xxxxxxx"> 上記でも、ブラウザの戻るボタンで戻った場合にキャッシュされてしまう場合がありますが、通常遷移ではキャッシュされないと思います。 header関数がエラーで送信できていないことも考えられますので、PHPのエラー表示をONにしてみて、already headersなどのエラーが出てないか確認してください。 <?php ini_set('display_errors', '1'); //php.iniの設定値をエラーを表示するに。 error_reporting(E_ALL); //全てのエラー(Warningとか)を画面上に出力する ?>
お礼
参考URLと全く同様のheadをindex.phpの最初に入れてアップロードしその後dbの情報を変更し リロードしてみましたが結果変わらずでした・・・ FFのアドオンのLive HTTP headersでチェックしてみましたが反映はされているようです。 以下が出力なのですが何かおかしなところはありますでしょうか? GET / HTTP/1.1 Host: サイトURL User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ja Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Cookie: PHPSESSID=*** If-Modified-Since: Thu, 03 Sep 2009 04:51:31 GMT Cache-Control: max-age=0 HTTP/1.x 304 Not Modified Date: Thu, 03 Sep 2009 04:51:44 GMT Server: Apache Connection: Keep-Alive Keep-Alive: timeout=7, max=100 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: private, max-age=10800, pre-check=10800 ちなみにエラーも試してみましたが何も表示されませんでした。
補足
追記です。 dbにはpearのmdb2を利用しておりプリペアで処理を行っています。 そこらが問題かとも疑いローカル環境にて全く同様のソースで試しましたがこちらはdbを更新すれ ばすぐに反映されます。 となると考えられる残りはサーバーの問題でしょうか? ちなみにエックスサーバーのx10を使用しております。原因もわからずキャッシュ問題にかれこれ 数日間悩ませられているので何かヒントでも頂けるといいのですが。。。
- hogehoge78
- ベストアンサー率80% (433/539)
<?php header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); header("Pragma: no-cache"); ?> これを全ての出力の前(つまりHTMLや空白などをレンダリングする前)に記述すると、回避出来ます。HTTPの仕様的には。 ※ブラウザによって実装が異なっている場合があり、キャッシュされてしまう場合もあります。
お礼
お返事ありがとうございます。 アドバイス通り空白無しで入れてみましたがやはりうまく機能しないようです。 検証ブラウザはIE8とFF3.5です。 残念ながら仰るとおりHTTPの仕様的な事で済ませられてる様子です^^; 1つ発見がありheaderを入れなくても例えば新着情報のdbを更新し表示するファイルindex.phpを 上書きでアップロードするだけで情報が変更されるようです。 dbを使用した不動産や車屋のサイト等は最新の情報に見れる事に意義があるので何か対応策が あればいいのですが。。。 原因がわからず謎ですが引き続きご意見をお待ちしております。
お礼
お返事ありがとうございます。 >hogehoge.php?foo=ランダムな文字列 で試したところキャッシュの有無なく最新が表示されました。 となるとやはり気になるところがseoなのですが・・・ キャッシュ問題でかなり検索してみましたがやはりheaderを入れる情報しかみつからず エラーもなく出力されているようだったので全く原因すらわからず諦めモードです^^; できそうな事は全てやったくらいの勢いなのですが困りました・・・