0

私はあなたが私を助けることができるかもしれない問題を抱えています:

たとえば10-00で、PHP関数にajaxを使用して複数のリクエストがあります。

私の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;
   }
}

したがって、私のクライアント リクエストの 1 つは、results最初に結果を計算してテーブルに格納する必要があります。

他のリクエストは、results新しい計算なしでテーブルから情報を取得する必要があります。この問題を解決するにはどうすればよいですか (LOCK TABLE???)? ありがとう!

4

1 に答える 1

0

作成したINSERTステートメントで「INSERTIGNORE」を使用します。これは、同じ結果がすでに利用可能な場合、それが再度挿入されないことを意味します。これにより、2つのスクリプトがほぼ同時に結果を計算する場合があります。ただし、これはおそらく非常にまれであり、計算自体はおそらくそれほど長くはかからないので、これが実際の問題になるとは思いません(そうなるでしょうか?)。計算の実行に使用されるMySQLクエリも、クエリキャッシュから回答されます。

または、共有メモリにすでに計算されている結果のリストを保持し(http://php.net/manual/en/book.shmop.php)、新しい計算を開始するときにこのリストを参照することもできます。結果。個人的には、すべての結果を1回だけ計算することがアプリケーションにとって不可欠でない限り、これは「INSERTIGNORE」に依存するよりもはるかに多くの作業になると思います。

于 2012-04-05T11:39:20.797 に答える