我是数据库的新手,最近我遇到了一个非常奇怪的问题:
我为我的游戏创建了一个数据库作为排行榜服务器,其中包含玩家名称和分数。我创建了一个php scipt来查询数据库,游戏将打开带有GET参数的php url。
我的提交分数功能完美无缺。我用phpadmin来检查。每次我提交它都会正确更新数据库。
问题是检索排行榜,我的游戏每10秒检索一次排行榜。它每次都成功。但它获得的分数始终不是数据库中最新的记录,都是以前的记录。几个小时后,它可以获得更新的数据。
以下是我的问题排查: 1我在提交分数php脚本中没有包含“commit”。所以我manully做了提交,但游戏仍然无法得到最新的数据。
php脚本:
$query = "SELECT * FROM `space_scores` ORDER by `score` DESC";
$result = mysql_query($query) or die('Query failed: ' . mysql_error());
$num_results = mysql_num_rows($result);
for($i = 0; ($i < $lines)&&($i<$num_results); $i++)
{
$row = mysql_fetch_array($result);
echo $i+1 . "," . $row['name'] . "," . $row['score'] . "|";
}
答案 0 :(得分:3)
您需要关闭查询缓存
set session query_cache_type=0;
有关详细信息,请参阅此链接:
答案 1 :(得分:1)
您的php服务器正在缓存sql查询以避免重复查询并减少负载
通过
将其关闭set session query_cache_type=0;
在用于select的php脚本的开头。
此外,每10秒运行一次数据库查询并不是一个好主意。当您扩展到1000个用户(假设)时,您每秒至少会有100个请求,这对您的服务器来说不是很好。
考虑运行查询数据库的php脚本,并通过设置cron作业每隔1分钟将结果写入xml或逗号分隔文件,并每隔10秒从服务器获取此文件而不是php
答案 2 :(得分:0)
我注意到您没有包含关闭与DB连接的代码。如果它在那里,你只是没有显示它,那么忽略这一点。但除此之外,我想知道如果它创建一个缓存数据的持久连接,直到建立新连接,你是否显式关闭与数据库的连接。
如果要关闭连接,则可能需要查看数据库本身是否设置为缓存数据一段时间。
我真的认为这听起来像是一个缓存问题。
答案 3 :(得分:0)
我认为您应该再次查看整个代码,看看您是否使用了分数的实例。为了更清楚地了解您是否使用了先前数据库检索的分数数据。确保删除此类实例,并且每次都从DataBase中检索所需的数据。