0

我使用 SendGrid 官方 PHP 库和 SMTP API 构建了一个自动邮件应用程序(自动邮件程序在 Ubuntu 服务器上作为 cron 作业运行)。

生产服务器上的内存限制设置为 32M,但在生产服务器上第一次运行应用程序时,我收到了消息

允许的内存大小 33554432 字节已用尽,试图分配 256478 字节

由于 256478 < 33554432,这完全没有意义,但我怀疑我在某处有内存泄漏。

根据这篇文章,PHP 存在内存泄漏问题,在处理对象之间的相互关系时,我使用我自己的 Wrapper 类,以使代码更具可读性和结构化,一个主 mailService 类,以及每个任务的一个类,即实现一个接口,并返回每封电子邮件的所有特定数据(标题、子值、收件人列表)。

我将从向我的接口和每个类添加一个析构函数开始,以确保没有内存泄漏,但我不确定这是否能解决问题,因为根据我执行的内存基准测试,大部分执行时间,内存被 SwiftMailer 的 MailTransport.php 类消耗。

所以我的问题基本上是,如何在每次迭代时重置这个类的内存使用量?,是否有内置的东西,或者我应该自己实现这样的方法?

非常感谢任何帮助。

小可视化:在此处输入图像描述

4

2 回答 2

5

允许的内存大小 33554432 字节已用尽,试图分配 256478 字节

意味着 PHP 正在尝试在脚本运行期间分配的内存之外分配额外的256478,并且该额外请求将使用的总内存推到了 33554432 阈值之上。

早期版本的 PHP 在遇到对象之间的循环引用时会出现内存问题,尽管 5.4 对此有所改善...。您是否受到影响将取决于您正在运行的 PHP 版本,以及您的类是否实际上包含此类循环引用

于 2013-05-22T08:42:09.937 回答
0

自 5.3 以来,PHP 具有垃圾收集功能,您可以尝试使用它来查看它是否有助于您的特殊情况。另请参阅this other SO question

于 2013-05-22T14:49:05.387 回答