【问题标题】:Memory limit problem in phpphp内存限制问题
【发布时间】:2023-03-28 06:01:02
【问题描述】:

我在 php.ini 中有一个内存问题。我已将 php.ini 中的限制设置为 512 M

/var/log/apache2/error.log 的输出是:

PHP 致命错误:允许的内存大小 536870912 字节用尽(试图 分配 71 个字节)在 /var/www/phpgraphlib.php 第 578 行,

有趣的代码是:

 foreach ($saved_test_figurestoprint as $figuretoprint){
        if (strpos($obj[$figuretoprint],",") >0 ){
  $graphfilename= "graphfile".remove_invalid_chars_for_file($obj["_id"])."_".remove_invalid_chars_for_file($figuretoprint).".png" ;        
        $graph = new PHPGraphLib(1000,200,$graphfilename);
        $data = explode(',', $obj[$figuretoprint]); 
$graph->addData($data);
$graph->setTitle($figuretoprint);
$graph->setBars(false);
$graph->setLine(true);
$graph->setDataPoints(true);
$graph->setDataPointColor('maroon');
$graph->createGraph();
?> <td> <?  echo $figuretoprint ; ?></td> <td> <? 
echo <<<END
<imag src=$graphfilename>
END

?> </td></tr><tr><?
echo "</br></br>";
echo "used memory is ".memory_get_usage(true) . "\n";   

最新的输出是: 已用内存为 30408704

我使用的是 64 位 ubuntu 和 php 5.3。 Linux mongo-db-server 2.6.35-28-generic #49-Ubuntu SMP Tue Mar 1 14:39:03 UTC 2011 x86_64 PHP 版本 5.3.3-1ubuntu9.3 如果要绘制的图像超过 40 张,就会出现问题。

我认为新的内存限制未应用于服务器 我发现了这个错误 http://bugs.php.net/52061 但仅适用于内存限制 > 2GB

你能帮我吗?

【问题讨论】:

  • 如果有你最后一行的输出,我可能会很有趣(使用的内存是...)。
  • 破坏/取消设置你的 PHPGraphLib 类...
  • 我添加了 unset($graph); echo "使用的内存是 ".memory_get_usage(true) 。 "\n"; echo "内存峰值是 ".memory_get_peak_usage(true) 。 "\n";并且输出仍然处于同一水平使用内存为 30670848 内存峰值为 34340864。与我的 512MB 限制相比,这太低了
  • 你好。我已经解决了这个问题。似乎mongo数据库中有一个特定的条目导致了它。由于某种原因,它保留了大量的内存。它可能已损坏。我已将其删除,现在一切顺利。

标签: php memory 64-bit limit


【解决方案1】:

我要做的第一件事是确保您在更改 php.ini 后完全重新启动您的网络服务器。

如果这不起作用,那么试试这个:

  1. 确保您正在写入正确的 php.ini 文件。创建一个 info.php 文件并确保写入正确的文件。

  2. 在你的 for 循环的底部做:

未设置($graph); 未设置($数据);

那些似乎是最大的变量,显然是在积累数据,而不是被垃圾收集器拾取。

【讨论】:

  • 我不认为取消设置变量会有帮助,在循环顶部重新分配变量可以让垃圾收集器非常清楚旧内存可以被释放。
  • 我见过垃圾收集器不够快的场景。这可能是其中之一。取消设置变量不会有什么坏处。
【解决方案2】:

PHP unset 只是删除对对象的引用,它不会清除内部对象内存分配,所以在迭代过程中,您每次都创建大对象,然后创建对象的销毁函数,并在该函数中取消设置每个使用类变量,那么只有使主对象不稳定才会释放它占用的整个内存。希望这个事实对任何人都有帮助

【讨论】:

  • unset($variableReferringToA) 减少对象A 的引用计数器以及BCD 所指的所有对象的引用计数器...一。当对象的计数器达到 0 时,该对象可以/将被从内存中删除。所以你可以说unset 递归地工作。不必为unset所有实例变量写类析构函数。
猜你喜欢
  • 1970-01-01
  • 2011-06-26
  • 2011-05-21
  • 2016-02-02
  • 1970-01-01
  • 2017-02-18
  • 2011-03-21
相关资源
最近更新 更多