在PHP5中处理内存消耗的策略?

时间:2008-10-23 21:57:16

标签: php memory

我们有一个大型管理软件,可以生成各种大型报告,基于众多循环,包括数据库检索,对象创建(许多)等。

在PHP4上它可以运行,内存限制为64 MB - 现在我们已经将它移动到新服务器上并使用相同的数据库 - 相同的代码,相同的报告不会在没有内存限制的情况下出现。 ..

我知道PHP5已经在很多方面发生了变化,但有没有办法让它表现得很好?

最后的问题是,当你需要节食脚本时,你会采用什么策略?

5 个答案:

答案 0 :(得分:6)

我们遇到的一个大问题是对象之间的循环引用会阻止它们在超出范围时释放内存。

根据您的体系结构,您可以使用__destruct()并手动取消设置任何引用。对于我们的问题,我最终重组了类并删除了循环引用。

答案 1 :(得分:6)

当我需要优化任何脚本上的资源时,我总是尝试分析,配置和调试我的代码,我使用xDebugxDebug Profiler,还有其他选项,例如APD }和Benchmark Profiler

另外我推荐你这篇文章:

答案 2 :(得分:0)

自从迁移到新服务器后,您是否确认您的MySQL和PHP系统变量与它们在旧服务器上的方式相同?

PHP5引入了许多新功能,但由于其向后兼容的口头禅,我不相信PHP5和PHP4之间的差异应该会对应用程序的性能产生如此大的影响,因为应用程序的代码和数据库还没有改变。

您是否也使用相同版本的Apache或IIS?

听起来这个问题更可能与您的新系统环境有关,而不是从PHP4升级到5。

答案 3 :(得分:0)

贝特朗,

如果您对重构现有代码感兴趣,那么我建议您在执行报告时首先监控CPU和内存使用情况。您是在锁定SQL服务器还是锁定了Apache(如果PHP代码将大量压力放在系统上,会发生这种情况)?

我参与了一个最初严重陷入MySQL的项目,我们不得不重构整个报告生成过程。但是,当我们完成加载后,只需转移到Apache(通过更复杂的PHP代码)。我们的最终解决方案是重构数据库设计,以便为报告函数提供更好的性能,并使用PHP来弥补我们在MySQL本身无法做的事情。

根据报告的性质,您可能会考虑对报告中使用的数据进行非规范化。您甚至可以考虑构建第二个用作数据仓库的数据库,它是围绕OLAP原则而不是OLTP原则设计的。您可以从Wikipedia开始,了解OLAP和数据仓库的一般说明。

但是,在您开始考虑严肃的重构之前,您是否通过查看phpinfo()验证了您的环境是否足够相似;用于PHP和SHOW VARIABLES; 在MySQL?

答案 4 :(得分:0)

一场演出!?!

甚至64MB都很大。

忽略环境之间的差异(听起来非常奇怪),听起来代码可能需要一些重新分解。

您可以重新考虑代码,以便数据库查询的结果集不会转储到数组中。我建议你为结果集构造一个迭代器。 (因此,您可以将它们视为大多数用途的数组)。一次处理一条记录与一次处理10,000条记录之间存在很大差异。

其次,看看您的代码创建多个数据实例的天气。你能通过引用传递对象吗? (使用'&')。当使用部落框架的早期变体时,我们必须做类似的事情。一个1 MB的附件将从多个调用中吹出50MB,这些调用将整个数据集作为副本传递,而不是作为参考。