gpt4 book ai didi

php - 如何修复 PHP 中的内存泄漏

转载 作者:IT王子 更新时间:2023-10-29 00:12:44 26 4
gpt4 key购买 nike

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

目前,它正在从 CSV 文件导入。它正在读取 CSV 文件的每一行,使用 fgetcsv 一次读取一行,并且对于每一行,它都对该记录进行大量处理,包括数据库查询,然后继续下一行。它不应该需要继续积累更多的内存。

导入大约 2500 条记录后,PHP 死机,说它已超出其内存限制(132 MB 左右)。

CSV 文件本身只有几兆 - 发生的其他处理会进行大量字符串比较、差异等。我有大量代码在上面运行,很难想出一个'最小的复制样本'。

有哪些好的方法可以找到并解决此类问题?

找到问题原因

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

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

最佳答案

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

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

最坏的情况是您的所有处理步骤都比较低效,您需要优化所有这些步骤。

关于php - 如何修复 PHP 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1010402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com