【问题标题】:Most efficient way to execute php mail script looping through 100s of records循环遍历 100 条记录的 php 邮件脚本的最有效方法
【发布时间】:2011-07-11 21:05:40
【问题描述】:

我有一个邮件脚本,它遍历大约 900 个订阅者(在数据库中),为每个订阅者构建一个单独的电子邮件并通过 SMTP 发送。该脚本是通过浏览器手动触发的,但是所涉及的记录数量导致脚本开始在中途超时。在测试中,该错误几乎总是超过 Fatal Error max execution time(尽管有一次出现与 mail() 和 SMTP 相关的错误)。我在想我可能应该从命令行运行这种类型的脚本,但是,该脚本仍然需要手动触发(通过 CMS 管理员用户) - 有没有人对处理这个问题的好方法有任何建议?

【问题讨论】:

  • 在后台运行它作为具有更长最大执行时间的分叉进程。

标签: php email command-line timeout performance


【解决方案1】:

我认为您可以在脚本中设置 PHP 脚本的超时时间。

但是,我宁愿使用基于 CRON+PHP-CLI 的解决方案。无论您使用 CGI 还是 CLI,PHP 代码都保持不变,但是在 CLI 模式下没有隐式时间限制。

【讨论】:

  • 如果手动执行,CRON 作业不会有太大帮助。
  • 在这种情况下,您可以在用户完成手动部分(例如选择收件人)后“分叉”php-cli。见Running a Background Process from PHP on Linux
  • 是的!您手动创建一个“任务列表”,cronjob 每 2 分钟触发一次,并发送列表中的前 10 封邮件(数字随机)
【解决方案2】:

调整运行时间限制只会暂时推迟问题。

您没有说这是在什么操作系统上运行 - 当然如果您有一个本地 MTA 可能会有所帮助,但正确的解决方案是生成一个单独的进程。请注意,这种方法存在许多缺陷 - 有关如何在 Unix 类型系统上正确执行此操作的详细信息,请参阅 this post

【讨论】:

  • 谢谢,我正在运行 CentOS,所以这个链接非常有用。我只是想弄清楚如何触发现有的守护进程来启动邮件脚本,例如如何在 apache 处理的初始用户输入之后执行此命令 - > print echo /usr/bin/php -q mailer.php | at now;
【解决方案3】:

set_time_limit (0);应该做的伎俩。

关于更有效的方法没什么好说的,除非我们看到你的代码......

【讨论】:

    【解决方案4】:

    使用cronjobs,每次 cron 执行脚本时,它都可以发送少量邮件。

    例如 Typo3 mailer engine 每 5 分钟调用一次,它会检查是否有任何邮件需要发送。

    所以用户不会手动触发邮件脚本。用户只标记应该由邮件引擎发送的时事通讯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多