用PHP脚本不断遇到一个奇怪的问题。该脚本的想法是从MySQL表中获取一堆数据,对其进行处理,比较另一个表中的一些数据,并将结果打印到CSV格式的文件中。
这个脚本将运行数十万次迭代来完成。我遇到的问题是,即使在数组中使用unset(),在MySQL查询中使用free(),内存也会持续使用,直到大约350000次迭代时内存耗尽。
毫无疑问,每次运行脚本时,memory_get_usage()报告的内存分配都保持不变,直到大约1050次迭代。然后它将增加262144个字节。通过测试,它也总是在脚本中完全相同的位置递增。在下面的代码块中,它总是在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
有什么建议吗??
在5.3版本之前,php有一个非常愚蠢的垃圾收集器:php 5中的对象内存泄漏。有了这个,你甚至无法用unset()
释放内存。在取消设置之前,您必须中断循环引用,或者只需使用php5.3即可。
您查看了检索的数据吗
$attRow = $AttResults->fetch_object()
在1050迭代之前/前后?
和是的,我会在while中更改赋值,在循环之前取一次,在结束之前取一个,看看内存是否发生了变化。