我父亲希望建立一个时事通讯调度系统,该系统提供定制字段作为量身定制系统的一部分。用户可以使用文本中的一些特殊变量来插入收件人的姓名(以及其他内容)。
要求邮件中所有数据的最后一个HTML表单会将数据以及收件人集插入数据库。然后,用户被重定向到工作人员脚本。
在工作人员脚本中(我们称之为worker.php
),他大致有以下内容:
# Get current job from the database.
# Pop off the first recipient in the list.
# Retrieve additional data about that recipient from the database.
# Generate and send email.
# Store truncated list of recipients in database.
if (work_left) {
header('Location: worker.php');
}
else {
header('Location: done.php');
}
工作人员只执行一个工作项以避开PHP时间限制。系统将部署在共享主机上,该主机可能具有最神秘的php.ini
设置。
它可以工作,处理工作项并且数据库中的收件人数量减少。现在无法预料的问题是浏览器最终会进入超时状态,取消连接。然后取消PHP脚本,不再进行任何工作。通过将浏览器指向worker.php
可轻松重新启动该过程,但这是最终用户不应该做的事情。
在这个网站上快速搜索给了我ignore_user_abort
函数,它看起来很有希望避免浏览器超时。我担心这不能解决这种情况下的问题:浏览器会在某个时刻关闭连接。当前运行的PHP脚本将完成运行,然后告诉浏览器重新加载worker.php
。浏览器不再监听,进度也停止了。这是一项改进,因为它不会停止中间交易,但不能解决问题。
我们的另一个想法是将重定向替换为worker2.php
。该PHP文件只包含一个重定向回worker.php
。这可能是浏览器的足够进展,它将继续加载并且不会进入超时(希望超时是每个URL至少?)。
如果这也不起作用,那么带有<meta>
的HTML重定向可能是另一种选择。然后worker.php
实际上完成加载,浏览器将能够完成请求。然后,<meta>
会再次重定向到worker.php
以执行下一个工作项。最后一个的缺点是仍然依赖浏览器打开。
在最好的情况下,他正在寻找一种解决方案,一旦启动就会贯穿始终。浏览器可能会超时,用户可以关闭窗口,脚本仍会运行并发送所有电子邮件。是否有可能生成一个工作程序,使其不受PHP执行时间限制和浏览器超时的影响?
答案 0 :(得分:0)
也许不是依赖于共享主机上的花哨背景脚本而只使用crontab(即使你的托管服务提供商没有给你一个你可以使用一些允许你模拟cron的服务),这将每分钟启动一次脚本( ?)。脚本将检查队列表中是否有一些工作,选择一些(尽管您的服务器将允许您处理)并将已处理的任务标记为已完成(或从表中删除它们)。然后,您可以提供一些端点,发件人可以访问该端点以查看其进度(计算用户的所有任务和标记为已完成的任务)。 我不认为你能够在碎片上使用RabbitMQ + supervisord或类似的东西,但我不认为使用后台PHP脚本是个好主意:))