你需要取消设置PHP内存问题吗?
Posted
技术标签:
【中文标题】你需要取消设置PHP内存问题吗?【英文标题】:PHP memory question do you need to unset? 【发布时间】:2011-08-24 10:42:07 【问题描述】:如果在脚本执行完成之前不取消设置数组会怎样?
我正在处理数千个 CSV 文件,将数十万客户的数据解析为数组。它在前 5/6 小时内运行良好,然后开始陷入困境。
我每次执行大约运行 5-10 个 CSV...我想知道取消设置脚本中的数组是否会对此有所帮助...我认为脚本结束后它们将被取消分配。我错了吗?
【问题讨论】:
你没有提到你是使用命令行 php 还是在 web 服务器中访问它。 您需要取消设置数组以在任何给定的执行运行中在每个 csv 之间清理它,假设每个 csv 必须独立处理。但作为一般规则,程序使用的所有内存都会在程序退出时释放,这也适用于 PHP。 @jon 这是我通过 FireFox 调用的脚本... 一个运行六个(或更多)小时的 PHP 脚本?我真的会尝试更改脚本,因此它不需要运行那么长时间。如果这不可能,命令行脚本可能会更好,因为它不需要您保持浏览器打开。 @Arjan,运行一批 5 或 10 个文件通常需要 10 分钟...我运行 5 个文件,然后将它们从目录中删除,放入新文件并运行它再次..我做的很少,因为我并没有真正编写大量的错误处理代码,如果有问题,我不想筛选大量数据来发现问题。从上个星期四开始,我整天都在这样做。 【参考方案1】:据我所知,数组 - 就像所有内存一样 - 在脚本执行时应该死掉。
您的 PHP 脚本是否被另一个 PHP 脚本调用?如果您通过“包含”来执行此操作,则基本上会将您的“较低”级别的 PHP 脚本插入到较高级别的脚本中——这将导致它们持续存在。
【讨论】:
这个脚本是一个补丁,用于纠正我第一次导入数据时所犯的错误。我不得不返回并设置一个我第一次忘记的日期字段,所以它的基本框架,1 try 语句和一个错误捕获 if 语句...我在我的本地机器上,我有一个正在运行的数据库的克隆环境,但是在运行脚本大约 5 小时后,我的机器停止响应,直到我停止并重新启动 apache 和 php。 ..我想知道那是什么问题。 你是如何遍历文件的?不知何故,我认为您不会手动将脚本指向每个单独的文件! 我有一个目录 /csv,我将要解析的文件放在其中...然后读取目录并将列表放入数组中,然后遍历每个数组。 如果你使用 FOREACH,那么程序不会死掉。我假设您正在对数组中的元素调用一个函数,而不是生成一个新进程,但我敢打赌我是对的。 $files = dirfiles('csv/'); foreach ($files as $el => $val) foreach ($val as $file) try if (($handle = fopen($file, "r")) != FALSE) // 做事 【参考方案2】:脚本结束时所有内存都被清除。
您是否尝试过使用memory_get_peak_usage()
和memory_get_usage()
?它们对于查找内存分配问题很有用。
【讨论】:
【参考方案3】:脚本成功完成后,应清理所有使用的内存。如果不是,这是 PHP 中的一个错误。在这里取消设置数组无济于事。
【讨论】:
【参考方案4】:我认为这取决于您运行的 PHP 版本。 PHP 5.3 有一个改进的垃圾收集机制,可以防止这种内存泄漏。此页面 (http://www.php.net/manual/en/features.gc.performance-considerations.php) 记录了 5.3 之前版本中的问题,但建议您可以使用 gc_collect_cycles()
函数手动调用垃圾收集(如果我已正确阅读)。
【讨论】:
我正在运行 5.3.4...但肯定会查看该文档。谢谢! 您可能还想看看您的代码。我最近在一个我正在帮助调试的 javascript 应用程序中遇到了一个叫做闭包的东西。发生的事情是,在 IE 中,每次脚本与 DOM 交互时,内存使用量都会增加。事实证明,脚本的一部分正在创建对应该被销毁的对象的循环引用,从而释放内存,但由于循环引用,IE 垃圾收集器无法清理这些未使用的对象。你可以在这里阅读更多 - javascriptkit.com/javatutors/closures.shtml .....【参考方案5】:Unset
只是破坏了一个变量——它不会释放内存。如果该行为在运行数小时后发生,并且这是一个一次性脚本,则可以将 CSV 文件拆分为更小的块以加快处理速度并帮助找出问题开始发生的位置。
【讨论】:
我运行 5-10 个,每个平均 2 兆。运行一个批次通常需要 10 分钟左右。 看起来像实心尺寸。你确定是它的 php 导致了问题吗?也许它只是数据库文件变得太大或类似的东西。 可能是..我不确定。重新控制我的系统的唯一方法是重新启动 apache 和 php... 这只是停止脚本当时正在执行的操作。我的建议:把它分解成更小的部分,然后一个一个地开始。这可能会缩小问题范围。 是的,这就是为什么我将批次减少到 5-10 个文件...我会单独做一段时间,看看我想出了什么。以上是关于你需要取消设置PHP内存问题吗?的主要内容,如果未能解决你的问题,请参考以下文章