PHP 脚本内存泄漏直至最终溢出

标签 php memory

不断遇到 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

有什么尝试的建议吗??

最佳答案

在 5.3 版本之前,php 有一个非常愚蠢的垃圾收集器:Memory Leaks With Objects in PHP 5 .有了这个,你甚至不能用 unset() 释放你的内存。您必须在取消设置之前中断循环引用,或者至少使用 php 5.3。

关于PHP 脚本内存泄漏直至最终溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14821267/

相关文章:

c - 在c中的destroyer函数中使用free()后内存泄漏(根据splint)

php - 获取mysql中某个字段的最后一个值

c++ - 列表的析构函数删除虚拟 C++,基本问题

php - MySQL中如何使用不同表的数据获取相应的记录

php - undefined offset PHP,不确定它的作用

java - Android 高效加载大量图像

c++ - 编译器会为这个对象保留内存吗?

java - 尽管有足够的可用内存,但巨大的数组仍会耗尽内存

php - Symfony 2 登录验证

php - 跨多个服务器的 Laravel Task Scheduler 没有重叠