【发布时间】:2014-01-17 13:47:55
【问题描述】:
我打开了许多指向同一个自动刷新 PHP 页面的浏览器窗口。它访问 MySQL 数据库以识别过期的客户信息。专门获取最后一天未更新的记录并强制更新。其余代码似乎处理得很好。
这是我的 MySQLi 查询:
$query = "SELECT *
FROM customers
WHERE customer_group='consumables' AND customer_updated < DATE_SUB(NOW(), INTERVAL 1 DAY)
ORDER BY RAND()
LIMIT 10";
我被告知 RAND() 不太适合,因为它处理大表的速度很慢,但是在这个项目结束之前我的表不会增加到超过 20000 个。我还有一个随机变量被传递到 URL,例如“clientdataupdates.php?nocachepls=1541231”。
所以这是我的问题:在当前的 5000 条记录中,如果此脚本同时在多个浏览器窗口中运行,它们将获得从 MySQL 返回的相同记录。诚然,选择的记录似乎是随机选择的,但如果查询在完全相同的时间运行,则在所有窗口中都会返回相同的记录。
我的研究非常有限,因为我一直在搜索的关键字(现在已经有几天了)似乎与其他问题有关,例如“php mysql 在使用 rand() 时返回相同的结果”有太多谷歌响应,通常指向使用 rand()。
虽然我仍然希望得到任何帮助,但实际上我更想知道为什么会发生这种情况。我对 MySQL 内部工作原理的了解有限,但根据我与 PHP 和 MySQL 交互的所有经验,我也没有看到任何类似的事情发生。
更新:
我还测试了使用包含回调函数的 ajax 函数来再次启动它。每次 div 内容都是相同的记录 - 但看起来仍然是随机选择的记录。
<div id='worker1' class='workerDiv'>worker: waiting..</div>
<div id='worker2' class='workerDiv'>worker: waiting..</div>
<div id='worker3' class='workerDiv'>worker: waiting..</div>
<div id='worker4' class='workerDiv'>worker: waiting..</div>
<div id='worker5' class='workerDiv'>worker: waiting..</div>
<script>
function nextWorker(thisWorker){
setTimeout(function(){ ajaxpage('customerdata_worker.php',thisWorker,nextWorker(thisWorker)); }, 10000);
}
setTimeout(nextWorker('worker1'), 100);
setTimeout(nextWorker('worker2'), 100);
setTimeout(nextWorker('worker3'), 100);
setTimeout(nextWorker('worker4'), 100);
setTimeout(nextWorker('worker5'), 100);
</script>
【问题讨论】:
-
对不起,php文件中的原始sql字符串确实有限制,问题正在发生。它应该是 $query = "SELECT * FROM customers WHERE customer_group='consumables' AND customer_updated