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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (30)

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

目前,它是从CSV文件导入的。它正在读取CSV文件的每一行,每行一行使用fgetcsv,并且对于每一行它都会对该记录进行大量处理,包括数据库查询,然后转到下一行。它不应该保持积累更多的记忆。

在大约2500条记录导入后,PHP结束,称它已经超过了内存限制(132 MB左右)。

CSV文件本身只有几个兆字节 - 发生的其他处理会执行大量的字符串比较,比较等。我有大量的代码在其上运行,并且很难提出“最小再现样品'。

有哪些好方法?

提问于
用户回答回答于

这将有助于查看代码,但如果你想自己调试它,请查看Xdebug,它将帮助您分析应用程序。

当然,根据你在做什么,它有可能积累了一些内存,尽管对于2500条记录来说,132MB似乎已经很高。当然,如果需要,你可以在php.ini中调整你的内存限制。

用户回答回答于

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

  • 更改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";

最糟糕的情况是,所有的处理步骤都是低效的,你需要优化所有处理步骤。

扫码关注云+社区