【问题标题】:How to send 12 000 emails via Swiftmailer in Symfony2?如何在 Symfony2 中通过 Swiftmailer 发送 12 000 封电子邮件?
【发布时间】:2012-01-19 09:44:01
【问题描述】:

有时我们需要发送很多电子邮件。我们选择 100 个用户,为每个用户创建邮件,发送它(添加到假脱机),制作$em->clear()。但即使在生产环境中,我们也不能发送超过 4000 封电子邮件:得到“无法分配内存”。

这样做的正确方法是什么?向我们的命令添加参数,使用--skip=4000多次执行它?

【问题讨论】:

  • 好吧 - 错误来自哪里?例如,您是否使用 APC 并且内存不足?
  • serialize 调用时,Swift_FileSpool::queueMessage 发生错误

标签: symfony swiftmailer spool


【解决方案1】:

我们所做的是,我们是否将其线程化...所以,假设您有一个包含用户的表,并且您有一个 ID 和 EMAIL 列。我们假设以 0 结尾的 ID 的数量与以 1、2 等结尾的 ID 数量相同。

现在我们的脚本只发送电子邮件给以 0 结尾的人,另一个脚本发送给 id 字段以 1 结尾的人,等等。例如,您使用参数来定义它,假设您的脚本名为“send-a-lot.php”,您将运行以下 10 个命令:

php send-a-lot.php --ending-on=0
php send-a-lot.php --ending-on=1
php send-a-lot.php --ending-on=2
php send-a-lot.php --ending-on=3
php send-a-lot.php --ending-on=4
php send-a-lot.php --ending-on=5
php send-a-lot.php --ending-on=6
php send-a-lot.php --ending-on=7
php send-a-lot.php --ending-on=8
php send-a-lot.php --ending-on=9

在您的代码中,您想要执行以下操作:

if ($id % 10 == $endingOnParameter) {
  // send the mail
}

这不是您要问的,但至少我们这样做是为了帮助“一些”我们的负载问题

【讨论】:

    【解决方案2】:

    我提到我的经历: 我在资源非常有限的共享服务器上使用 symfony 和 SwiftMailer 发送了大约 8000 封个人电子邮件。我有一个包含用户的表,并创建一个任务或命令来进行分页查询,并通过我的任务中的参数传递页面大小。 Y 每 30 分钟在 cron 作业上执行此任务或命令。您可以根据您的资源进行配置。使用查询页面大小,您可以管理要发送的电子邮件数量,使用 cron 作业,您可以管理批次之间的时间。 我承认有更专业和更强大的解决方案,但这是我在资源有限的共享服务器上找到的唯一方法。

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多