我使用SendGrid官方PHP库和SMTP API构建了一个自动邮件程序应用程序(自动邮件程序在Ubuntu服务器上作为cron作业运行)。
生产服务器上的内存限制设置为32M,但是在生产服务器上第一次运行应用程序之一时,我收到了消息
允许的内存大小为33554432字节,耗尽,尝试分配256478字节
自256478以来,完全没有任何意义。 33554432,但我怀疑某处有内存泄漏。
根据to this post,PHP有内存泄漏问题,在处理对象之间的互惠关系时,我使用自己的Wrapper类来使代码更具可读性和结构,主要是mailService类,还有一个类每个任务实现一个接口,并返回每封电子邮件的所有特定数据(标题,子值,收件人列表)。
我将首先在我的界面和每个类中添加一个析构函数,以确保没有内存泄漏,但我不确定这是否会解决问题,因为根据内存基准我执行了大部分执行时间,并且内存被SwiftMailer的MailTransport.php类消耗。
所以我的问题基本上,我如何在每次迭代时重置此类的内存使用情况?,是否有内置的内容,或者我应该自己实现这样的方法?。
非常感谢任何帮助。
小型可视化:
答案 0 :(得分:5)
允许的内存大小为33554432字节,耗尽,尝试分配256478字节
意味着PHP正在尝试在运行脚本期间超出已分配的附加 256478,并且附加请求已被推送在33554432阈值上使用的总内存。
早期版本的PHP在遇到对象之间的循环引用时会出现内存问题,尽管这已经在5.4中得到了改进....您是否受到影响将取决于您运行的是哪个版本的PHP,以及您的类是否实际包含此类循环引用
答案 1 :(得分:0)
PHP具有5.3 garbage collection功能,您可以尝试使用它来查看它是否有助于您的特定情况。另请参阅this other SO question