1

我有一个处理我的电子邮件订阅的 PHP 脚本。

它做了类似的事情:

foreach email to be sent:
    mailer->send-email
    print "Email sent to whoever."

我现在遇到了我的网络主机的速率限制。邮件库有一个内置的节流器,它会休眠以确保我保持在速率之下。但是,这可能会导致网页需要几个小时才能实际加载。

客户端浏览器会放弃页面加载吗?任何建议的更好的解决方案?

4

2 回答 2

4

为什么这是在网页加载时完成的?这应该是一个计划运行的离线后端进程。(查看cron调度任务。)

任何长时间运行的进程都应该委托给后端服务来处理该进程。应用程序界面(例如网页)应该尽快响应用户,而不是强迫用户等待(超过一个小时?)等待响应。

应用程序可以跟踪后端进程的进度,通常是通过一些共享数据源(例如简单的数据库),并将该进度呈现给用户。没关系。但是这个过程本身应该发生在应用程序之外。

例如,在高水平...

  1. 安排一个 PHP 脚本运行以处理电子邮件。
  2. 当脚本启动时,将一条记录保存到数据库中,表明它已启动。
  3. 每次脚本达到某种里程碑时,更新数据库记录以表明这一点。
  4. 脚本完成后,更新数据库记录以表明这一点。
  5. 有一个 Web 应用程序来检查该数据库记录并向用户显示后端进程的当前状态。
于 2012-05-19T15:51:15.117 回答
1

您可能不在乎,但即使您强制此脚本保持活动状态,也不应故意通过网络服务器运行长时间运行的脚本。Webserver 使用资源繁重的线程或进程来运行您的脚本,并且它们可用于服务器 Web 请求的数量有限。一个长时间运行的脚本基本上会将其中一个从可用于服务器 Web 访问者的进程池中取出。

相反,请使用直接执行 php 二进制文件的 cron 作业。具体来说,不要使用wgetlynx任何其他 Web 浏览器之类的程序作为 cron 作业的一部分,因为这些方法通过 Web 服务器运行脚本。cron 命令应该包括类似

php /full/path/to/the/script.php

于 2012-05-19T15:51:44.570 回答