gpt4 book ai didi

php - 如何避免 PHP/MYSQL 指数级减速?

转载 作者:行者123 更新时间:2023-11-29 12:52:23 26 4
gpt4 key购买 nike

我是一款基于浏览器的在线游戏的所有者,该游戏约有 300 名玩家注册。我编写了一个脚本来检测作弊者,但问题是该脚本中的查询数量会呈指数级增长。

它的工作原理如下:

  1. 发送获取玩家信息的查询。
  2. 在查询内,运行另一个查询来获取每个玩家的信息。

所以基本上我正在运行一个查询来获取每个玩家的姓名和信息,并且在该查询中我运行另一个查询来获取除了他们自己之外的所有其他玩家的信息。我用它来比较和删除作弊者。

问题是,由于我有 300 名玩家,因此我必须为每个玩家运行 300 个查询。那是 90,000 个查询。如果我的玩家达到 1,000 名,那么查询次数将达到 1,000,000 次。必须有更好的方法来做到这一点。

我的代码:

 <?php
require '../connect.php';

$rulerinfo = $conn->query("SELECT id, rulername, nationname, alliance, email, dateregister, user_agent, lastseen, password FROM players");
while ($rulerinfo2 = $rulerinfo->fetch_assoc()) {
$id = $rulerinfo2['id'];
$rulername = $rulerinfo2['rulername'];
$nationname = $rulerinfo2['nationname'];
$alliance = $rulerinfo2['alliance'];
$email = $rulerinfo2['email'];
$dateregister = $rulerinfo2['dateregister'];
$useragent = $rulerinfo2['user_agent'];
$lastseen = $rulerinfo2['lastseen'];
$password = $rulerinfo2['password'];

$playerinfo = $conn->query("SELECT id, rulername, nationname, alliance, email, dateregister, user_agent, lastseen, password FROM players WHERE id != '$id'");
while ($playerinfo2 = $playerinfo->fetch_assoc()) {
$id2 = $playerinfo2['id'];
$rulername2 = $playerinfo2['rulername'];
$nationname2 = $playerinfo2['nationname'];
$alliance2 = $playerinfo2['alliance'];
$email2 = $playerinfo2['email'];
$dateregister2 = $playerinfo2['dateregister'];
$useragent2 = $playerinfo2['user_agent'];
$lastseen2 = $playerinfo2['lastseen'];
$password2 = $playerinfo2['password'];

$rulerdistance = levenshtein($rulername, $rulername2);
$nationdistance = levenshtein($nationname, $nationname2);
$emaildistance = levenshtein($email, $email2);
$agentdistance = levenshtein($useragent, $useragent2) / 2;

$totaldistance = $rulerdistance + $nationdistance + $emaildistance + $agentdistance;

if ($password == $password2) {
$totaldistance = $totaldistance - 20;
}

if ($totaldistance < 0) {
$totaldistance = 0;
}


}

}
?>

最佳答案

您应该只执行一次查询,将其放入数组中并从那里使用它。我认为没有必要两次进行几乎相同的查询。第二次循环数组并检查 id 是否与当前的不同。

$res = $conn->query("SELECT id, rulername, nationname, alliance, email, dateregister, user_agent, lastseen, password FROM players");

$array=array();
while ($row = $res->fetch_assoc()) {
$array[] = $row;
}

for($i=0; $i<count($array);$i++) {
for($j=0; $j<count($array); $j++) {
if ($i != $j) {
// Call your functions
$rulerdistance = levenshtein($array[$i]['rulername'], $array[$j]['rulername']);
...
}
}
}

关于php - 如何避免 PHP/MYSQL 指数级减速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24539034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com