【问题标题】:PHP Script Memory Leaking Until Eventual OverflowPHP 脚本内存泄漏直到最终溢出
【发布时间】:2013-01-27 02:14:30
【问题描述】:

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

有什么建议可以尝试吗?

【问题讨论】:

  • 您使用的是什么版本的 PHP?与 5.2 相比,PHP 5.3 显着提高了内存使用率。
  • 我正在使用 5.4.11 并且正在从命令行调用脚本(如果这有什么不同的话)。
  • 我不太明白这几十万次的迭代是从哪里来的。显示的while循环是否经常运行?还是整个脚本都在一个循环中?
  • @fab:整个脚本在循环中运行;否则他的 cmets(在代码中)将没有意义。
  • 在两个while循环内。最外面是一个 do...while 循环,它将传入的数据分解成大块,最里面的循环遍历查询中的每一行。我必须分解最外层的块,否则较大的查询会立即杀死内存。我试图让它运行在大约 5300 万个条目的数据集上。但现在如果能完成 100 万,我会很高兴。

标签: php memory


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您是否查看了以下人员检索到的数据:

    $attRow = $AttResults->fetch_object()
    

    在迭代 1050 之前/前后?

    ...而且...是的,我会在 while 中更改分配,在循环之前进行一次提取,在结束之前进行一次提取以查看内存是否发生变化。

    【讨论】:

    • 我已经检查过了。该变量包含一个关联数组,其中包含 3-6 个元素。切换到一个 fetch_all() 并且内存使用没有改变。
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2011-02-05
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2013-11-24
    相关资源
    最近更新 更多