当我们在循环中使用 PHP mysqli->query() 然后 fetch_row/fetch_assoc 时,PHP 是否首先缓存数据并返回整个结果(因此如果行同时更新, fetch_row()仍然返回旧数据?还是为我们提供实时数据?
有没有什么地方可以设置这种行为(例如设置数据库类型、php 配置...?)以便我们可以控制 PHP 是否应该根据需要使用缓存数据或实时数据。
例如,我们有 2 个进程修改同一个数据库表 'users':
文件 1:
<?php
$res=$mysqli->query("SELECT * FROM users WHERE id > 0 and id < 100 ORDER BY id ASC");
while($r=$res->fetch_assoc()){
...do something that takes 10 mins each loop...
print_r($r['active']);
}
文件 2:
$mysqli->query("UPDATE users SET `active` = 'TRUE' where id = 90");
假设最初所有用户都将 active
设置为 FALSE。
我们在一个终端上运行文件 1,然后在另一个终端上运行文件 2。
文件1来处理用户“90”时,打印出的是“TRUE”还是“FALSE”?
谢谢。
最佳答案
$res=$mysqli->query("SELECT * FROM users WHERE id > 0 and id < 100 ORDER BY id ASC");
您的查询仅在那一步执行。之后您如何访问数据不会使 PHP 再次查询记录。您正在运行的循环位于一个 PHP 内部变量上,该变量包含查询返回的所有数据。在你的循环中没有与 MySQL 服务器的进一步通信。
如果在查询之后和显示之前更改了记录,您将看到显示的是旧数据。不是实时的。
要获取在此期间可能已被另一个进程更新的最新数据(我们通常在这里谈论微/毫秒/任何秒),您需要再次查询。
At the time when file 1 comes to process the user "90", does it print out "TRUE" or "FALSE"?
错误
因为当您查询数据库时,它被设置为 FALSE
,除非您再次查询,否则当前值是什么并不重要。
关于php - PHP mysqli query 和 fetch_(row/assoc) 是否使用实时数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41870190/