動的なPHPサイトでMySQLキャッシュデータがなぜデータをキャッシュするのですか?
質問
データベースからデータをキャッシュし、PHPページが時代遅れのレコードを表示しているように見えるという点で、PHP/MySQLサイトに不快感を覚えています。実際、データベースから完全に削除されたURLにリンクするページがありますが、更新されたレコードや欠落データさえ表示されません。
数時間(未定義の)時間待つという忍耐がある場合、データは最終的に表示されます。すべてのページにPHPを介して通常のノーキャッシュヘッダーを追加しましたが、MySQL出力には影響しないようです。
ただし、サイトのPHP部分は即座に更新可能であり、HTMLなどがすぐに変更されます。 MySQLにクエリから新鮮なデータのみを描くように強制する方法はありますか?とにかくこれが機能した方法だと思いました!
ありがとう、クリス
PSここに私が使用しているPHPコードは、キャッシュなしの状況を強制しようとします。
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // Always modified
header("Cache-Control: private, no-store, no-cache, must-revalidate"); // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); // HTTP/1.0
解決
あなたがすることができます SQL_NO_CACHEを選択します. 。これは、mysqldumpが常にテキストファイルに新しいデータをダンプするために使用されます。これは、選択されているテーブルがINNODBである場合、InnoDBバッファープールをフラッシュするのにも役立ちます。
選択されたステートメントを操作できない場合は、設定してください query_cache_type to 0. 。これにより、Select SQL_NO_CACHEのようにすべての選択が動作します。 mysqlを再起動せずにこれを行うことができます:
ステップ1)これを/etc/my.cnfに追加します
[mysqld]
query_cache_type=0
ステップ2)これをMySQLクライアントで実行します
SET GLOBAL query_cache_type = 0;
最後の言葉
これを行うと、読み取りI/Oが増加する可能性があります。また、可能な限り完全にフラッシュされた最も新鮮なデータを使用して、Innodb_max_dirty_pages_pct = 0にinnodbバッファープールを設定することを検討することもできます。
ステップ1)これを/etc/my.cnfに追加します
[mysqld]
query_cache_type=0
innodb_max_dirty_pages_pct=0
ステップ2)これをMySQLクライアントで実行します
SET GLOBAL query_cache_type = 0;
SET GLOBAL innodb_max_dirty_pages_pct = 0;
更新2011-05-20 11:17
すべてのDB接続がPHPの見晴らしの良い場所からタイムアウトした可能性があります。
MySQLとApacheを再起動するかどうかを確認してください。
また、MySQL、PHP、およびApacheのタイムアウト値がすべて一致することを確認してください
また、これを行います
netstat | grep [m3][y3][s0][q6] | grep TIME_WAIT
これは、DED DB接続がOSによってリリースされていないかどうかを確認するのに役立ちます
他のヒント
MySQLが行うことは、古いデータにつながるものではありません - クエリキャッシュではなく、sql_cacheではなく、key_bufferではなく、buffer_poolではありません。問題はmysqlの外側になければなりません。
おそらく、これらの一般的なPHPキャッシュアクセラレータのいずれかを使用しています。http://en.wikipedia.org/wiki/list_of_php_accelerators
APCとEacceleratorは、野生で最も使用されています。
各フレームワークまたはアプリが使用されている他のPHPキャッシュもあります。たとえば、WP-CacheまたはW3 Total Cacheを使用したWordPress、Smarty Cacheを使用したSmartyテンプレートなど。
あなたは「私たちのサイト」と言うので、SQL-relayやMySQL-Proxy-CacheなどのDBキャッシュを使用しているか、逆プロキシ、イカ、ワニス、メムキャッシュされたバリアントなどのフロントエンドキャッシュを使用しているかどうかを知っていると思います。 。
Webサーバーの外でPHP Webページをデバッグして、キャッシュがどこで行われているかを判断するのに役立ちます。
私見、あなたのアプリケーションが利用しているように聞こえます Memcacheまたはディスクベースのキャッシュ フォルダ。たとえば、WordPressには、 /キャッシュ/ フォルダ。このようなフォルダーがある場合は、次のようなハッシュのように見えるすべてのファイルを削除してみてください。
9a72de66e3c2f853d08352d8e78e7628
7e688f6a4cb633965d9883bb35cb8575
799f242667b315796ffe8f8d4bb4a3e2
f9e46e6486ca03ec62abc67d011f2a89
これは、MySQLデータベーステーブルとPHPで表示されるレコードを選択および表示する最も簡単なコードです。
$cn=mysql_connect($db_host,$db_user,$db_password) or die(mysql_error());
mysql_select_db($db_name,$cn) or die(mysql_error());
$sql = “SELECT field_name FROM table_name”;
$rs = mysql_query($sql) or die(mysql_error());
while($row = mysql_fetch_array($rs)){
echo $field_name = $row["field_name"];
echo “</br>”;
}
mysql_free_result($rs);
ソース: http://phphelp.co/2012/04/26/how-to-select-and-display-mysql-records-data-in-php