0

我有一个问题可能是你可以帮助我:

我对我的 PHP 函数使用 ajax 有多个请求,例如在 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???)?谢谢!

4

1 回答 1

0

我会在您编写的 INSERT 语句中使用“INSERT IGNORE”。这意味着如果相同的结果已经可用,则不会再次插入。这可能偶尔会导致两个脚本几乎同时计算结果。但是,我认为这不会是一个真正的问题,因为这可能非常罕见,而且计算本身可能不会花费很长时间(会吗?)。任何用于执行计算的 MySQL 查询也将从查询缓存中得到答复。

或者,您可以保留已在共享内存中计算的结果列表:(http://php.net/manual/en/book.shmop.php) 并在您即将开始计算新的时参考此列表结果。我个人认为这将比仅仅依靠“INSERT IGNORE”做更多的工作,除非每个结果只计算一次对您的应用程序至关重要。

于 2012-04-05T11:39:20.797 回答