【问题标题】:PHP doesn't free my memory?PHP 不会释放我的内存?
【发布时间】:2013-12-12 04:25:53
【问题描述】:

我有以下代码,它从数据库(相当多)接收数据并将它们传递给正在处理这些数据的函数。 代码如下所示。

for($o=0; $o<$times; $o++)
    {
        echo "Before Data: ".memory_get_peak_usage().PHP_EOL;
        $data = $u->getDataLimit($id, $market, ($o*5000));
        echo "After Data: ".memory_get_peak_usage().PHP_EOL;

        echo "Before Process: ".memory_get_peak_usage().PHP_EOL;
        $feed.= $p->process($data, ($o*5000) , 0, 0);
        echo "After Process: ".memory_get_peak_usage().PHP_EOL;

        $data = null; // or unset($data) doesnt matter.

        echo "After All: ".memory_get_peak_usage().PHP_EOL.PHP_EOL;
    }

这就是输出。

Before Data: 9587976
After Data: 37969952
Before Process: 37969952
After Process: 70166880
After All: 70166928

Before Data: 70166928
After Data: 83876232
Before Process: 83876232
After Process: 118233752
After All: 118233752

Before Data: 118233752
After Data: 141275760
Before Process: 141275760
After Process: 178939696
After All: 178939696

Before Data: 178939696
After Data: 202189192
Before Process: 202189192
After Process: 242915840
After All: 242915840

Before Data: 242915840
PHP Fatal error:  Allowed memory size of 262144000 bytes exhausted (tried to allocate 32 bytes) in /var/www/repricing/repricing/library/Zend/Db/Statement/Pdo.php on line 290

memory_get_usage() 的输出:

Before Data: 9476792
After Data: 37943024
Before Process: 37969952
After Process: 70182072
After All: 56630760

Before Data: 56630760
After Data: 83864432
Before Process: 83897400
After Process: 118242320
After All: 113905024

Before Data: 113905024
After Data: 141247528
Before Process: 141278200
After Process: 178989656
After All: 174954320

Before Data: 174954320
After Data: 202216704
Before Process: 202251672
After Process: 243004472
After All: 241208824

Before Data: 241208824
PHP Fatal error:  Allowed memory size of 262144000 bytes exhausted (tried to allocate 95 bytes) in /var/www/repricing/repricing/library/Zend/Db/Statement/Pdo.php on line 290

在我看来,PHP 并没有释放$data,而是将其全部放在首位? $feed 只是一个字符串。不是很大。 我不明白为什么该脚本内存不足。以及为什么它不释放数据。

【问题讨论】:

  • 可能问题出在getDataLimitprocess 函数中?
  • 那么$o*5000 值在$u-&gt;getDataLimit()$p-&gt;process() 中的作用是什么?

标签: php performance memory-management memory-leaks


【解决方案1】:

您必须使用memory_get_usage(),因为memory_get_peak_usage() 是使用的最大内存。

当您取消设置时,内存会被清除,但如果您有此 var 的另一个副本,则此副本会保留在内存中。

在您对$p-&gt;process($data) 的调用中,如果数据不是对象或数组,将被复制。如果数据是一个数组,并且您在 process 函数中对其进行了修改,那么也将被复制。用 & 尝试 passing by reference

我建议您使用xhprof 扩展名进行内存使用检查。您可以按功能查看内存使用情况。

【讨论】:

  • 好吧,使用memory_get_usage() 时,未设置似乎有效。但也只是第一次。为什么我们看不到第二次,第三次......时间的内存减少?复制问题的原因?我没有得到确切的。 $data 是一个数组。嗯,实际上是一个朱迪对象。我应该怎么做才能不发生复制?
  • 遗憾的是,通过引用传递,对内存使用没有任何影响。但问题似乎出在process()。顺便说一句process()“header”现在看起来像这样:public function findNewPrice(&amp;$products, $multi);
  • 我知道,但这是一个很大的方法/类。我不知道我应该发布哪些部分。因此,我认为我必须自己处理它。但感谢 XHProf。我想这会对我有所帮助,找到内存泄漏。谢谢你。我会将该问题标记为已接受。
猜你喜欢
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多