【发布时间】:2025-12-20 22:20:17
【问题描述】:
我使用 SendGrid 官方 PHP 库和 SMTP API 构建了一个自动邮件应用程序(自动邮件程序在 Ubuntu 服务器上作为 cron 作业运行)。
生产服务器上的内存限制设置为 32M,但在生产服务器上第一次运行应用程序时,我收到了消息
已用尽允许的 33554432 字节内存大小,试图分配 256478 字节
从 256478
根据to this post,PHP 存在内存泄漏问题,在处理对象之间的相互关系时,我使用自己的 Wrapper 类,以使代码更具可读性和结构化,主 mailService 类,以及每个类任务,实现一个接口,并返回每封电子邮件的所有特定数据(标题、子值、收件人列表)。
我将首先向我的接口和每个类添加一个析构函数,以确保没有内存泄漏,但我不确定这是否能解决问题,因为根据我的内存基准测试已经执行了,大部分执行时间,内存被SwiftMailer的MailTransport.php类消耗掉了。
所以我的问题基本上是,如何在每次迭代时重置这个类的内存使用量?是否有内置的东西,或者我应该自己实现这样的方法?
非常感谢任何帮助。
小可视化:
【问题讨论】:
-
您是否正在构建所有电子邮件收件人的列表?这很容易成为内存占用者,尤其是在 32M 限制较低的情况下
-
嗯,每个特定任务仅适用于某些用户,NotifyTokenExpiry 仅适用于其令牌在过去一个月内过期的用户,topScores 仅适用于排名积极的用户等等,并且在在每次迭代结束时,我 unset() 保存收件人列表的成员,并在之后为其分配一个空值以确保。无论如何,您必须有相当数量的电子邮件才能超过 32M 的限制,我只测试了我的应用程序,邮件数量低于 500 封
标签: php memory-management memory-leaks