【问题标题】:PHPMailer- Should I send emails in runtime, or via cron job?PHPMailer - 我应该在运行时发送电子邮件,还是通过 cron 作业?
【发布时间】:2017-01-06 01:16:21
【问题描述】:

我正在使用 PHPMailer 库来处理从我的应用程序中发送电子邮件。

问题是,当某些电子邮件被触发发送时(例如,当联系表单提交、新用户注册等时),页面加载可能需要 1-3 秒,而电子邮件是发送。如果发送邮件出现问题,延迟可能会更长。

我正在考虑将任何需要发送的电子邮件保存到我的数据库中的pending_emails 表中,然后每分钟运行一个 cron 作业,它会发送所有这些电子邮件,然后将它们从表中删除。

我的问题是,这看起来合乎逻辑吗?每分钟运行一个 cron 作业与在运行时发送电子邮件相比,我应该有任何潜在的资源问题吗? (我需要经常运行 cron 作业,因为有人可能正在等待紧急消息,例如“重置密码”电子邮件)

【问题讨论】:

  • 替代上面的选项创建一个邮件脚本,您可以从命令行调用然后运行exec('script >pipe output ot stop blocking');您的主脚本将立即继续,但它对于错误处理不是那么好。我称之为穷人多线程

标签: php


【解决方案1】:

你已经做对了。

在运行时发送,就在您响应用户的 HTTP 请求时,是最简单的事情。但是,当然,响应速度会因此变慢。这在小型应用程序中并没有糟糕,因为发送电子邮件的速度比人们想象的要快。绝对有效。

当然,实现消息队列是更优雅和可扩展的方法。但这需要更多的工作。您使用pending_emails 数据库表的想法是完全有效的。有此类队列的库和组件,但您不必使用它们。

【讨论】:

    【解决方案2】:

    这是一个非常基于意见的问题,因此您会得到很多不同的、相互矛盾的答案,因为有些人可能会告诉您可以让用户等待 1-3 秒,因为时间不长,但我倾向于不同意这一点。然而,我通常做的是使用Queue

    There are ways to create a queue WITHOUT using 3rd party software,但也有一些出色的工具,例如 RabbitMQIron.ioBeanstalkd,它们对于在后台执行任务非常有帮助。这些服务将您的任务推送到队列中,队列中的这些项目在后台中及时处理,但用户几乎立即得到响应(取决于您在做什么)。这就是我通常在后台处理资源密集型任务(例如发送电子邮件)的方式,以避免延迟对用户的响应。

    祝你好运。

    【讨论】:

      【解决方案3】:

      查看线程 (PHP Threading)。我建议您创建一个调用电子邮件发送的新线程。这样,您可以在不等待电子邮件发送的情况下向用户返回响应,并且电子邮件发送过程将在另一个线程中并行运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-20
        • 2011-04-26
        • 2021-03-23
        • 1970-01-01
        • 1970-01-01
        • 2011-12-19
        • 2011-03-23
        • 1970-01-01
        相关资源
        最近更新 更多