使用PHP脚本继续遇到一个奇怪的问题。该脚本的想法是从MySQL表中获取一堆数据,处理它,比较来自另一个表的一些数据,并将结果打印成CSV格式的文件。
此脚本将运行数十万次迭代才能完成。我遇到的问题是即使在数组上使用unset()和在我的MySQL查询上使用free(),内存仍然会被使用,直到大约350,000左右,内存耗尽。
没有失败,每次我运行脚本时,memory_get_usage()报告的内存分配保持不变,直到大约1050次迭代。然后它将增加262,144字节。通过测试,它也总是在脚本中完全相同的位置递增。在下面的代码块中,它总是在b2a的一次迭代中递增(最多4次可能的迭代)。
//up here we get the data to run analysis/comparisons on.
echo "{$lineCounter}b: " . memory_get_usage(TRUE) . "\n"; //27525120
if ($AttResults = $db_cx->query($ObsAttQuery)) {
echo "{$lineCounter}b1: " . memory_get_usage(TRUE) . "\n"; //27525120
$attArray = array();
echo "{$lineCounter}b2: " . memory_get_usage(TRUE) . "\n"; //27525120
while ($attRow = $AttResults->fetch_object()) {
echo "{$lineCounter}b2a {$attRow->attId}: " . memory_get_usage(TRUE) . "\n"; //27787264
$attArray[$attRow->attId] = $attRow->value;
}
echo "{$lineCounter}b3: " . memory_get_usage(TRUE) . "\n"; //27787264
$AttResults->free();
if (empty($attArray)) continue;
//down here after it is done I have an unset on the $attArray variable
有关要尝试的事情的任何建议吗?
答案 0 :(得分:0)
在版本5.3之前,php有一个非常愚蠢的垃圾收集器:Memory Leaks With Objects in PHP 5。有了这个,你甚至无法用unset()
释放你的记忆。你必须在取消设置之前打破循环引用,或者至少使用php 5.3。
答案 1 :(得分:0)
您是否查看了检索到的数据:
$attRow = $AttResults->fetch_object()
迭代1050之前/之后?
...而且......是的,我会在while中更改赋值,在循环之前进行一次提取,在结束之前进行一次提取以查看内存是否发生变化。