【问题标题】:PHP or MySQL caches queriesPHP 或 MySQL 缓存查询
【发布时间】:2016-01-04 13:50:02
【问题描述】:

我有一个大问题!我开发了一个 PHP 脚本,它使用许多查询从 MySQL 数据库中插入、选择和删除值。我从来没有遇到过任何问题,直到现在。现在它开始显示昨天的数据。如果我通过 PHP 运行 INSERT 查询,它会显示真实数据,但如果我再次访问该页面或其他任何页面,它仍会显示昨天的数据。查询并不复杂,只是一些SELECT * FROM table 和简单的INSERT 查询。我认为某些东西使用缓存来运行查询。

我尝试了SQL_NO_CACHE,但结果相同。

返回昨天数据的简单代码示例。

$sql = "SELECT SQL_NO_CACHE * FROM persoane";
$query = mysqli_query($db_conx, $sql) or die(mysqli_error($db_conx));

会是什么?

稍后编辑:

我的一个页面上有这个脚本:

include_once("php_includes/check_login_status.php");
include_once("php_includes/db_conx.php");
include_once("php_includes/functii.php");
$sql = "SELECT * FROM persoane WHERE status='a' ORDER BY nume";
$query = mysqli_query($db_conx, $sql);
$data =  date("d-m-Y");

if(isset($_POST['orainceput'])){
    $persid = $_POST['prezpersid'];
    $ora = $_POST['orainceput'];
    $nota = $_POST['notaprez'];
    $autor = $_SESSION['user'];

    $psql = "INSERT INTO prezente (persoana_id, data, ora_inceput, autor, nota) VALUES ('$persid', NOW(), '$ora', '$autor', '$nota')";
    $pquery = mysqli_query($db_conx, $psql);

}

如果设置了$_POST['orainceput'],并且在内部查询运行后,一切正常:它显示应该显示的内容。如果我刷新页面,它会再次显示缓存数据。我不明白!我从来没有遇到过这个问题!

【问题讨论】:

  • 你验证过这些吗?例如。你检查过数据库有新记录吗?如果清除浏览器缓存会发生什么?
  • 嗨!是的,数据在数据库中,如果我清除浏览器缓存,我会得到相同的结果。我不是在谈论浏览器缓存,原因很简单:我的客户打电话给我,告诉我这个问题,我去应用程序也看到了。我在考虑服务器端缓存。
  • 您是否创建了一个能够重现行为的最小应用程序?
  • 是的,我有。结果相同。但是我设法解决了它,看来这是托管服务器的问题。正如我所说,它从 SQL 缓存返回数据。
  • 那么当您验证数据库时为什么没有看到缓存的结果?

标签: php sql caching


【解决方案1】:

我怀疑它是浏览器缓存。正确/错误行为之间的一个显着区别是 GET 与 POST 请求。地点:

  • HTTP POST 请求不可缓存;和
  • HTTP GET 是可缓存的。

根据您用于测试的浏览器,它可能会实施非常激进的缓存方法。我建议尝试匿名模式,或者只是从浏览器中清除所有缓存并尝试重新加载页面。也可以尝试不同的浏览器。

除此之外,我会检查 Web 服务器配置,以确保向客户端发送了哪些额外的 HTTP 标头以及是否存在与缓存相关的标头。

【讨论】:

  • 嗨!我没有说它是浏览器缓存。我也对此表示怀疑,因为客户打电话给我并告诉我这个问题,我去网页也看到了。我在考虑 PHP 或 MySQL 缓存(任何类型的服务器端缓存)。 POST 的问题是,在我运行它之后,一切正常,它显示了它应该显示的内容。正确的数据(例如新条目)存储在数据库中......但不显示。
【解决方案2】:

由于 HTTP 协议本身是无状态的,并且每次加载页面时都会启动一个新的 PHP 线程,因此它不会缓存任何用户数据,除非您告诉它这样做(例如:写入/读取结果对数据访问层中文件的查询)。 MySQL 可以缓存查询结果,但是当相关表接受任何更改表的 CRUD/DML 操作时,查询缓存条目会自动清除。

来自 MySQL 文档:

如果表发生更改,使用该表的所有缓存查询都将变为无效并从缓存中删除。这包括使用映射到已更改表的 MERGE 表的查询。可以通过多种语句更改表,例如 INSERT、UPDATE、DELETE、TRUNCATE TABLE、ALTER TABLE、DROP TABLE 或 DROP DATABASE。

缓存应该位于应用程序和浏览器之间:浏览器本身、代理等,或者在应用程序中实现。检查您的应用程序及其运行环境。

更多参考

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 2012-12-01
    • 1970-01-01
    • 2015-02-05
    • 2012-08-20
    相关资源
    最近更新 更多