【发布时间】:2011-02-05 17:48:20
【问题描述】:
我有一个运行 mysql 查询的 php 脚本,然后循环结果,并且在该循环中还运行几个查询:
$sqlstr = "SELECT * FROM user_pred WHERE uprType != 2 AND uprTurn=$turn ORDER BY uprUserTeamIdFK";
$utmres = mysql_query($sqlstr) or trigger_error($termerror = __FILE__." - ".__LINE__.": ".mysql_error());
while($utmrow = mysql_fetch_array($utmres, MYSQL_ASSOC)) {
// some stuff happens here
// echo memory_get_usage() . " - 1241<br/>\n";
$sqlstr = "UPDATE user_roundscores SET ursUpdDate=NOW(),ursScore=$score WHERE ursUserTeamIdFK=$userteamid";
if(!mysql_query($sqlstr)) {
$err_crit++;
$cLog->WriteLogFile("Failed to UPDATE user_roundscores record for user $userid - teamuserid: $userteamid\n");
echo "Failed to UPDATE user_roundscores record for user $userid - teamuserid: $userteamid<br>\n";
break;
}
unset($sqlstr);
// echo memory_get_usage() . " - 1253<br/>\n";
// some stuff happens here too
}
更新查询永远不会失败。
由于某种原因,在memory_get_usage 的两次调用之间,添加了一些内存。因为大循环运行了大约 500.000 次或更多次,最终它确实增加了很多内存。我在这里有什么遗漏吗?
会不会是内存实际上并没有在两个调用之间添加,而是在脚本中的另一点添加?
编辑:一些额外的信息: 在循环之前它大约为 5mb,在循环之后大约为 440mb,并且每个更新查询增加了大约 250 个字节。 (其余的内存被添加到循环中的其他地方)。 我没有发布更多“其他东西”的原因是因为它大约有 300 行代码。我发布这部分是因为它看起来是添加最多内存的地方。
【问题讨论】:
-
我没有看到这里的问题。请发布更多的 while 循环,并指出它正在使用多少内存。
-
第一次查询前、第一次查询后和循环后返回的 memory_get_usage 是什么?
-
@webbiedave 在循环之前大约 5mb,在循环之后大约 440mb,每个更新查询增加大约 250 个字节。 (其余的内存被添加到循环中的其他地方)。 @Marcus我没有发布更多“其他东西”的原因是因为它大约有300行代码。我发布这部分是因为它看起来是添加最多内存的地方。
-
我知道这是一个老问题,但下次请包括 PHP 的版本。我在使用 mysqli_fetch_array 时遇到了同样的问题,我确定我使用的是更新版本的 PHP。 (5.5,还是旧的)
标签: php mysql memory-leaks