我有一个问题可能是你可以帮助我:
我有一个使用ajax到我的PHP函数的多个请求,例如在10-00。
我的PHP文件功能:
public function calculate(){
$result = DB::query('SELECT * FROM `results` WHERE `time` > DATE_SUB(NOW(), INTERVAL "25" SECOND) ORDER BY `gameid` DESC LIMIT 1');
if (intval($result->num_rows) > 0) {
return json_decode($result->fetch_object()->data);
} else {
/*RESULT CALCULATION CODE /*SELECT FROM `players`....*/
$publish_date = date("Y-m-d H:i:s");
$result = DB::prepare("INSERT INTO `results` (`data`, `time`) VALUES (?,?) ON DUPLICATE KEY UPDATE `data` = VALUES(data), `time` = VALUES(time)");
$result->bind_param("ss", json_encode($arr), $publish_date);
$result->execute();
$result->close();
DB::query('TRUNCATE TABLE `players`'); /*WE CLEAN TABLE HERE*/
return $arr;
}
}
因此,我的一个客户请求应该首先计算结果并将其存储在表results
中。
其他请求应从results
表获取信息而不进行新计算。
我怎样才能解决这个问题(LOCK TABLE ???)?
谢谢!
答案 0 :(得分:0)
我只会在您编写的INSERT语句中使用“INSERT IGNORE”。这意味着如果相同的结果已经可用,则不会再次插入。这可能偶尔会导致两个脚本几乎同时计算结果。但是,我不认为这将是一个真正的问题,因为这可能是非常罕见的,并且计算本身可能不会花很长时间(是吗?)无论如何。用于执行计算的任何MySQL查询也将从查询缓存中回答。
或者,您可以保留已在共享内存中计算的结果列表:(http://php.net/manual/en/book.shmop.php)并在您即将开始时引用此列表计算新结果。我个人认为这比仅依靠“INSERT IGNORE”要多得多,除非对你的应用程序来说每个结果只计算一次是至关重要的。