首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何修复PHP中的内存泄漏

如何修复PHP中的内存泄漏
EN

Stack Overflow用户
提问于 2009-06-18 01:53:31
回答 8查看 20.6K关注 0票数 17

我的PHP应用程序有一个可以导入记录的导入脚本。

目前,它是从CSV文件导入的。它使用fgetcsv一次一行地读取CSV文件的每一行,并对每一行对该记录执行大量处理,包括数据库查询,然后转到下一行。它不应该需要不断积累更多的内存。

在导入了大约2500条记录之后,PHP就死了,说它已经超出了它的内存限制(132MB左右)。

CSV文件本身只有几个megs -发生的其他处理会做大量的字符串比较,比较,等等。我有大量的代码在它上面操作,它将很难提出一个“最小的再现样本”。

查找和修复此类问题的一些好方法是什么?

找到问题的原因

我有一个调试类,它在运行时记录我所有的数据库查询。因此,这些SQL字符串(大约30KB长)一直留在内存中。我意识到这不适合于设计为长时间运行的脚本。

可能还有其他来源的内存泄漏,但我相当确定这是我的问题的原因。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-06-18 02:02:33

查看一下代码会有所帮助,但如果您想自己调试它,可以查看Xdebug,它将有助于分析您的应用程序。

当然,根据您正在做的事情,它可能正在积累一些内存,尽管132MB对于2500条记录来说似乎已经很高了。当然,如果需要,您可以在php.ini中使用tweak your memory limit

您正在读取的CSV文件有多大?您对它进行了哪些对象和类型的处理?

票数 5
EN

Stack Overflow用户

发布于 2009-06-18 03:12:21

如果您确实怀疑脚本中只有一两个内存泄漏导致它崩溃,那么您应该执行以下步骤:

  • memory_limit更改为较小的值,如500KB
  • 注释掉应用于每行的所有处理步骤,只保留一个。
  • 对整个CSV文件运行有限的处理,看看是否可以再添加更多的步骤,并观察内存使用是否会激增。

示例:

ini_set('memory_limit', 1024 * 500);
$fp = fopen("test.csv", 'r');
while($row = fgetcsv($fp)) {
    validate_row($row);         // step 1: validate
    // add these back in one by one and keep an eye on memory usage
    //calculate_fizz($row);     // step 2: fizz
    //calculate_buzz($row);     // step 3: buzz
    //triangulate($row);        // step 4: triangulate
}
echo "Memory used: ", memory_get_peak_usage(), "\n";

最糟糕的情况是,您的所有处理步骤的效率都比较低,您需要对所有步骤进行优化。

票数 7
EN

Stack Overflow用户

发布于 2009-06-18 02:01:39

这取决于你在处理完变量后如何清除它们。

看起来您已经处理完了记录,但是您仍然将信息存储在某个地方。如果有疑问,可以使用unset()清除变量。

如果没有帮助,请提供一个最小的再现代码示例,看看所有的内存都到哪里去了。

顺便说一句,生成重现问题的最小代码样本是一种很好的调试技术,因为它会迫使您仔细地重新检查代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1010402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档