【问题标题】:Send mails in background without cron在没有 cron 的情况下在后台发送邮件
【发布时间】:2011-11-12 03:06:46
【问题描述】:

我想知道是否有一种方法可以运行 PHP 循环以便在后台向订阅者发送数百封电子邮件。我的目标是格式化时事通讯,单击发送,然后关闭浏览器或更改页面。当然,发送邮件的实际过程会在后台运行,不会因为浏览器关闭而中断。

我知道这可以通过从保存在 MySQL 或文本文件中的队列中读取的 cron 作业来完成,但是这样,即使很长一段时间没有队列,cron 也会一直运行,寻找队列...

我在一个名为 Pommo (https://github.com/soonick/poMMo) 的脚本中看到了这种功能,但似乎无法理解它是如何完成的。

有人对此有想法吗?

【问题讨论】:

    标签: php mysql linux email background-process


    【解决方案1】:

    我打算对您的问题添加评论,但我没有足够的空间来格式化并给出示例。

    这是一个我认为可行的想法:

    1 - 将您要发送的所有电子邮件加载到数据库或文件中。

    2 - 从您的 Web 应用程序中单击按钮以发送电子邮件。这将向服务器提交一个 Ajax 请求。您可以定义要在特定时间范围内发送的电子邮件数量。请记住,大多数主机对您每小时可以发送的电子邮件数量有限制。

    3 - 创建一个 php 脚本,它将接收 Ajax 请求并在您定义的参数内发送所有电子邮件。

    4 - 我相信您可以关闭您的网络浏览器,因为 PHP 脚本将运行整个列表,并且在发送完所有电子邮件之前不会返回。

    上述方法可能有效,但我永远不会这样做。如上所述,我会使用 cronjob。您的 cronjob 只需要检查是否有电子邮件要发送。这不是资源密集型的。

    如果您决定实施上述想法,请务必告知我们。我很好奇这是否可行。

    祝你好运!

    【讨论】:

    • 我认为如果 php 脚本有类似 ignore_user_abort(true) 的东西,否则它会在浏览器关闭时被杀死,对吧?
    • @fana - 来自 PHP 手册 - “您可以决定是否希望客户端断开连接以导致脚本中止。”你可以在这里阅读全文 -> php.net/manual/en/features.connection-handling.php
    • 该页面的 cmets 中有一些非常有趣的代码。我得试试看。
    • @fana - 祝你好运。听起来是个有趣的挑战。我会格外小心 php 超时设置。另外,我建议您编写一些代码来确认脚本发送了所有电子邮件。不知何故,我对在服务器中“无人值守”运行 php 脚本感到不舒服......:O)
    【解决方案2】:

    我知道这可以通过从保存在 MySQL 还是文本文件,不过这样的话,就算很久没有排队 期间,cron 会一直在运行,寻找队列...

    这几乎超出了 Cron 的目的。您应该创建一个作业,例如,每 15 分钟运行一次,并检查队列中是否有需要发送的邮件。如果没有邮件,让脚本死掉,它会在 15 分钟后再次运行。

    如果有要发送的邮件,请在开始发送之前更新行以指示您正在处理它们,因此运行时间超过 15 分钟不会导致另一个脚本实例发送相同的邮件。

    【讨论】:

    • 我猜你是对的。我只是不想在每次安装时都创建 cron 作业,因为我正在考虑将此系统添加到自定义 CSM...开始...
    【解决方案3】:

    您需要一个队列系统。有例如Beanstalkd 用于 linux,你可以用 php 来喂东西。

    【讨论】:

    • 这真的很好,但在我看来它需要通过命令行或一些 django 界面运行。我需要它由网页界面触发。
    • 需要在“php界面”中触发
    猜你喜欢
    • 2014-01-10
    • 1970-01-01
    • 2018-04-03
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    相关资源
    最近更新 更多