我的PHP应用程序有一个可以导入记录的导入脚本。
目前,它是从CSV文件导入的。它使用fgetcsv一次一行地读取CSV文件的每一行,并对每一行对该记录执行大量处理,包括数据库查询,然后转到下一行。它不应该需要不断积累更多的内存。
在导入了大约2500条记录之后,PHP就死了,说它已经超出了它的内存限制(132MB左右)。
CSV文件本身只有几个megs -发生的其他处理会做大量的字符串比较,比较,等等。我有大量的代码在它上面操作,它将很难提出一个“最小的再现样本”。
查找和修复此类问题的一些好方法是什么?
找到问题的原因
我有一个调试类,它在运行时记录我所有的数据库查询。因此,这些SQL字符串(大约30KB长)一直留在内存中。我意识到这不适合于设计为长时间运行的脚本。
可能还有其他来源的内存泄漏,但我相当确定这是我的问题的原因。
发布于 2009-06-18 02:02:33
查看一下代码会有所帮助,但如果您想自己调试它,可以查看Xdebug,它将有助于分析您的应用程序。
当然,根据您正在做的事情,它可能正在积累一些内存,尽管132MB对于2500条记录来说似乎已经很高了。当然,如果需要,您可以在php.ini中使用tweak your memory limit。
您正在读取的CSV文件有多大?您对它进行了哪些对象和类型的处理?
发布于 2009-06-18 03:12:21
如果您确实怀疑脚本中只有一两个内存泄漏导致它崩溃,那么您应该执行以下步骤:
memory_limit
更改为较小的值,如500KB示例:
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";
最糟糕的情况是,您的所有处理步骤的效率都比较低,您需要对所有步骤进行优化。
发布于 2009-06-18 02:01:39
这取决于你在处理完变量后如何清除它们。
看起来您已经处理完了记录,但是您仍然将信息存储在某个地方。如果有疑问,可以使用unset()清除变量。
如果没有帮助,请提供一个最小的再现代码示例,看看所有的内存都到哪里去了。
顺便说一句,生成重现问题的最小代码样本是一种很好的调试技术,因为它会迫使您仔细地重新检查代码。
https://stackoverflow.com/questions/1010402
复制相似问题