我们对我们的 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
MySQL 所做的任何事情都不会导致数据陈旧——不是 Query 缓存,不是 SQL_CACHE,不是 key_buffer,不是 buffer_pool。问题必须在 MySQL 之外。
你可以做SELECT SQL_NO_CACHE。mysqldump 使用它来始终将新数据转储到文本文件中。如果要选择的表是 InnoDB,这也可能有助于刷新 innodb 缓冲池。
如果您无法操作 SELECT 语句,则将 query_cache_type 设置为 0。这将使所有 SELECT 的行为类似于 SELECT SQL_NO_CACHE。您可以在不重新启动 mysql 的情况下执行此操作:
步骤 1) 将此添加到 /etc/my.cnf
步骤 2) 在 mysql 客户端中运行它
最后一句话
这样做可能会增加读取 I/O。您可能还需要考虑设置 innodb_max_dirty_pages_pct = 0 以保持 innodb 缓冲池具有尽可能完全刷新到磁盘的最新数据。
步骤 1) 将此添加到 /etc/my.cnf
步骤 2) 在 mysql 客户端中运行它
更新 2011-05-20 11:17
从 PHP 的有利位置来看,所有数据库连接都可能超时。
看看重新启动 MySQL 和 apache 是否会这样做。
另外,确保 MySQL、PHP 和 Apache 的超时值都匹配
另外,这样做
这有助于查看操作系统是否未释放任何死数据库连接
您可能正在使用以下通用 PHP 缓存加速器之一: http ://en.wikipedia.org/wiki/List_of_PHP_accelerators
我发现 apc 和 eaccelerator 在野外最常用。
每个使用的框架或应用程序还可以使用其他 PHP 缓存,例如,使用 wp-cache 或 w3 总缓存的 Wordpress,使用 smarty 缓存的 smarty 模板等。
你说“我们的网站”,所以我猜你会知道你是使用 SQL-relay 或 mysql-proxy-cache 之类的 DB 缓存,还是反向代理、squid 和 varnish 之类的前端缓存,或者 mem-cached 变体.
在 Web 服务器之外/没有 Web 服务器的情况下调试您的 PHP 网页,以帮助确定缓存发生的位置。
恕我直言,听起来您的应用程序正在使用memcache 或基于磁盘的缓存文件夹。例如,Wordpress 有可以利用/cache/文件夹的缓存插件。如果您有这样的文件夹,请尝试删除其中所有看起来像哈希的文件,例如:
这是从 MySQL 数据库表中选择和显示记录并在 PHP 中显示的最简单的代码。
来源: http: //phphelp.co/2012/04/26/how-to-select-and-display-mysql-records-data-in-php