我目前正在使用以下规则制作即时获胜游戏:第一个用户在最后一个用户获胜后至少半小时注册。所以用户可以每半小时赢一次。如果几个小时内没有人注册,第一个注册的人获胜。
服务器使用 PHP 5.2.0,这说明我不使用 DateTime 类。我的表winnertable 是InnoDB。
我的脚本的这一部分由每个客户在用户注册时调用,并决定用户是否获胜:
$currentTime = date("Y-m-d H:i:s");
// We're looking for the last winner in the winners table
$res = $dbh->query("SELECT date FROM winnertable ORDER BY id DESC")->fetch(PDO::FETCH_ASSOC);
if(empty($res)){
// If there is no last winner then the user wins
$winner = true;
}else{
// If there is already a last winner, we check the date of win, if superior to half an hour, the user wins
if(strtotime($currentTime)-strtotime($res["date"])>=1800){
// Last winner was half an hour ago : winner
$winner = true;
}
}
// if the winner flag is set to true, add the user id to the winners table along with the date of winning
if($winner){
$dbh->query("INSERT INTO winnertable (id_main, date) VALUES ('".$_SESSION['id']."', '".$currentTime."')");
}
下一页必须向用户显示结果,以便他知道他是否赢了。所以我不能做一个 CRON 工作来决定。
这个脚本是有缺陷的,因为如果多个客户端同时访问,它可能会使多个客户端获胜。
我已经阅读了一些解决方案:
- 使用锁:但我不知道性能成本。另外,我读到 MyIsam 表锁定了整个表,而 InnoDB 表只锁定了标记为更新的选定行。我不知道从那里做什么。
- 使我的“日期”列唯一应该防止多次插入同一日期,这似乎是一个优雅的解决方法,但它似乎有点太容易被信任,我真的很想得到你的建议。