【发布时间】:2012-10-26 12:47:31
【问题描述】:
我的应用程序需要生成一个包含一堆图表的 pdf 文件。
情况:我使用 FPDF 生成 pdf,使用 JpGraph 生成图表。我的代码从数据库中获取图形数据并进行迭代,为每个包含所有 JpGraph 代码的图形调用一个函数,用于设置、设置图形样式并将其作为 png 文件缓存在服务器上的缓存文件夹中。 FPDF 然后将这些图像放入 pdf 中,然后提供给浏览器。
问题:当图表数量超过一定数量时,我会遇到 PHP 内存不足错误。 AFAICT 这不是 FPDF 问题:在尝试诊断问题时,我生成了更大的文档,其中包含更多(预生成的)图形和同等大小的图像。问题似乎是在图形渲染函数中用于渲染图形的内存在函数完成时没有被释放。这是基于这样一个事实,如果我在函数中调用 memory_get_peak_usage,我会得到一堆不断增加的数字,每次调用函数时都会有一个数字,直到它停止时的限制为 64MB。
我的图形生成脚本如下所示:
function barChart($filename, $ydata, $xdata){
// Create the graph. These two calls are always required
$graph = new Graph(900,500);
$graph->SetScale('textlin');
//(bunch of styling stuff)
// Create the bar plot
$bplot=new BarPlot($ydata);
// Add the plot to the graph
$graph->Add($bplot);
//(more styling stuff)
// Display the graph
$graph->Stroke($filename);
$graph = null;
$bplot = null;
unset($graph);
unset($bplot);
echo "<br><br>".(memory_get_peak_usage(true)/1048576)."<br><br>";
}
如您所见,我尝试取消设置和取消 graph 和 bplot 对象,尽管我的理解是这不应该是必要的。当函数完成时,不应该释放 Graph 和 Bplot 实例使用的所有内存吗?或者这可能是 JpGraph 内存泄漏? (我到处搜索,找不到其他人抱怨这个)。这是我的第一个远程资源密集型 PHP 项目,所以我可能会遗漏一些明显的东西。
【问题讨论】:
-
你得到了我对这个问题的支持,因为它对我解决同样的问题有很大帮助(我使用的是 PHP 7)。我无法在任何地方找到解决方案,只能在这里。使用
memory_get_peak_usage(true)对调查由 JpGraph 产生的内存泄漏非常有帮助。
标签: php out-of-memory jpgraph