PHP内存问题是否需要取消设置?

PHP内存问题是否需要取消设置?,php,memory,unset,Php,Memory,Unset,如果在执行脚本之前未取消设置数组,会发生什么情况 我正在运行数千个CSV文件,将数十万客户的数据解析为数组。它在最初的5/6小时内工作正常,然后开始陷入糟糕的状态 我每次执行大约运行5-10个CSV…我想知道在脚本中取消设置数组是否会有帮助…我认为在脚本结束后它们将无法分配。我错了吗?据我所知,数组——就像所有内存一样——应该在脚本执行时消亡 您的PHP脚本是否被另一个PHP脚本调用?如果您是通过“include”实现的,那么实际上就是将“较低”级别的PHP脚本插入到较高级别的脚本中,这将导致它

如果在执行脚本之前未取消设置数组,会发生什么情况

我正在运行数千个CSV文件,将数十万客户的数据解析为数组。它在最初的5/6小时内工作正常,然后开始陷入糟糕的状态


我每次执行大约运行5-10个CSV…我想知道在脚本中取消设置数组是否会有帮助…我认为在脚本结束后它们将无法分配。我错了吗?

据我所知,数组——就像所有内存一样——应该在脚本执行时消亡


您的PHP脚本是否被另一个PHP脚本调用?如果您是通过“include”实现的,那么实际上就是将“较低”级别的PHP脚本插入到较高级别的脚本中,这将导致它们持久存在。

脚本成功完成后,所有使用的内存都应该清理干净。如果不是,这是PHP中的一个bug。取消设置数组在这里没有帮助。

我认为这取决于您运行的是哪个版本的PHP。PHP5.3有一个改进的垃圾收集机制,可以防止这种内存泄漏。此页()记录了5.3之前版本中的问题,但建议您可以使用
gc\u collect\u cycles()
函数手动调用垃圾收集(如果我正确阅读了它)

脚本结束时,将清除所有内存。

您是否尝试过使用
memory\u get\u peak\u usage()
memory\u get\u usage()
?它们对于查找内存分配问题非常有用。

取消设置只会破坏一个变量,而不会释放内存。如果该行为在运行数小时后发生,并且这是一个一次性脚本,可能会将CSV文件拆分为更小的块,以加快速度并帮助找出问题开始出现的位置。

您没有提到是否正在使用命令行PHP或在web服务器中访问它。您需要取消设置数组,以便在任何给定的执行运行中清理每个CSV之间的数组,假设每个csv都必须独立处理。但一般来说,当程序退出时,程序使用的所有内存都会被释放,这也适用于PHP。@jon这是我通过FireFox调用的一个脚本……一个运行六(或更多)小时的PHP脚本?我真的会尝试更改脚本,这样就不需要运行那么长时间。如果不可能,命令行脚本可能更好,因为它不需要您保持浏览器打开。@Arjan,运行一批5或10个文件通常需要10分钟……我运行5个文件,然后从目录中删除它们,我现在只做很少的工作,因为我没有编写大量的错误处理代码,如果有问题,我不想筛选大量的数据来发现问题。从上周四开始,我整天都在这么做哈。这个脚本是一个补丁,用来纠正我第一次导入数据时犯的一个错误。我必须返回并设置一个日期字段,我第一次忘记了,所以它是赤裸裸的,一个try语句和一个错误捕获if语句。。。我在本地机器上,那里有一个运行数据库的克隆环境,但在运行脚本大约5小时后,我的机器停止响应,直到我停止并重新启动apache和php。。。我想知道问题出在哪里。你是如何在文件之间循环的?不知何故,我不认为您是手动将脚本指向每个单独的文件!我有一个dir/csv,我把我想要解析的文件放在那里…然后它读取dir并将列表放入一个数组中,然后foreach通过每个数组。如果你使用foreach,那么程序不会死。我假设您正在对数组中的元素调用函数,而不是生成新进程,但我敢打赌我是对的。$files=dirfiles('csv/');foreach($el=>$val){foreach($val$file){try{if($handle=fopen($file,“r”)!=FALSE){//Do Stuff我正在运行5.3.4…但肯定会查看该文档。谢谢!您可能也想看看您的代码。我最近在帮助调试的javascript应用程序中遇到了一个称为闭包的东西。在IE中,每次脚本交互时,内存使用都在增加在DOM中。原来脚本的一部分创建了一个循环引用,指向一个应该被销毁的对象,从而释放了内存,但由于循环引用,IEs垃圾收集无法清理这些未使用的对象。你可以在这里阅读更多-…我正在运行5-10,其中每个对象平均2兆。通常不会运行一个批处理大约需要10分钟。看起来是一个稳定的大小。你确定是php导致了问题吗?可能是数据库文件太大或类似的问题。可能是..我不确定。重新控制我的系统的唯一方法是重新启动apache和php…这只是停止脚本,无论它当时在做什么。my建议:将其分解为更小的部分,然后逐个开始。这可能会缩小问题的范围。是的,这就是为什么我将批处理减少到5-10个文件的原因……我将单独处理一段时间,看看我能想出什么。