我们对我们的 PHP/MySQL 站点感到烦恼,因为它似乎从数据库缓存数据,而我们的 PHP 页面显示过时的记录。事实上,有些页面链接到已从数据库中完全删除的 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
Run Code Online (Sandbox Code Playgroud)
您可以执行SELECT SQL_NO_CACHE。mysqldump 使用它来始终将新数据转储到文本文件。如果选择的表是 InnoDB,这也可能有助于刷新 innodb 缓冲池。
如果您无法操作 SELECT 语句,请将query_cache_type 设置为 0。这将使所有 SELECT 的行为类似于 SELECT SQL_NO_CACHE。您可以在不重新启动 mysql 的情况下执行此操作:
步骤 1) 将其添加到 /etc/my.cnf
[mysqld]
query_cache_type=0
Run Code Online (Sandbox Code Playgroud)
步骤2)在mysql客户端中运行它
SET GLOBAL query_cache_type = 0;
Run Code Online (Sandbox Code Playgroud)
最后的话
这样做可能会增加读取 I/O。您可能还需要考虑设置 innodb_max_dirty_pages_pct = 0 以使 innodb 缓冲池保持尽可能完全刷新到磁盘的最新数据。
步骤 1) 将其添加到 /etc/my.cnf
[mysqld]
query_cache_type=0
innodb_max_dirty_pages_pct=0
Run Code Online (Sandbox Code Playgroud)
步骤2)在mysql客户端中运行它
SET GLOBAL query_cache_type = 0;
SET GLOBAL innodb_max_dirty_pages_pct = 0;
Run Code Online (Sandbox Code Playgroud)
更新 2011-05-20 11:17
从 PHP 的角度来看,所有数据库连接可能都已超时。
看看重启 MySQL 和 apache 是否可以。
另外,请确保 MySQL、PHP 和 Apache 的超时值全部匹配
另外,执行此操作
netstat | grep [m3][y3][s0][q6] | grep TIME_WAIT
Run Code Online (Sandbox Code Playgroud)
这有助于查看操作系统是否尚未释放任何失效的数据库连接