问题
我有一个表单,提交后将运行基本代码来处理提交的信息,并将其插入数据库中以显示在通知网站上。此外,我还有一个名单,他们注册了通过电子邮件和SMS消息接收这些通知的人员。此列表暂时是微不足道的(仅推送约150个),但是足以导致花费一分钟以上的时间来遍历整个订户表并发送150多封电子邮件。(由于批量电子邮件政策,电子邮件是根据我们的电子邮件服务器的系统管理员的要求单独发送的。)
在此期间,发布警报的个人将坐在表单的最后一页上将近一分钟,而不会对发布通知进行任何积极的强化。这导致了其他潜在的问题,我认为所有可能的解决方案都不理想。
首先,发布者可能认为服务器落后,然后再次单击“提交”按钮,导致脚本重新开始或运行两次。我可以通过使用JavaScript禁用按钮并替换文本来表示类似“正在处理...”的方法来解决此问题,但这并不理想,因为在执行脚本的过程中,用户仍然会停留在页面上。(此外,如果禁用了JavaScript,则此问题仍然存在。)
其次,张贴者在提交表格后可能会过早关闭标签或浏览器。该脚本将一直在服务器上运行,直到尝试写回浏览器为止,但是,如果用户随后浏览到我们域中的任何页面(在脚本仍在运行时),浏览器就会挂起加载页面,直到脚本结束。(只有在关闭浏览器的选项卡或窗口,而不是关闭整个浏览器应用程序时,才会发生这种情况。)但是,这并不理想。
(可能)解决方案
我已经决定将脚本的“电子邮件”部分分解为一个单独的文件,在发布通知后可以调用该文件。我最初想到的是在成功发布通知后将其放在确认页面上。但是,用户将不知道此脚本正在运行,并且任何异常对他们来说都是不明显的。该脚本不能失败。
但是,如果我可以将此脚本作为后台进程运行怎么办?因此,我的问题是:如何执行PHP脚本作为后台服务触发并完全独立于用户在表单级别执行的操作而运行?
编辑:这不能被cron'ed。它必须在提交表单后立即运行。这些是高优先级的通知。另外,运行我们的服务器的系统管理员不允许cron超过5分钟的时间运行。
exec()
但我从未尝试过。
ajax
并插入sleep()
时间间隔(在我的情况下使用foreach)来运行后台进程。它在我的服务器上完美运行。不确定其他人。我还要在循环之前添加ignore_user_abort()
和set_time_limit()
(具有计算的结束时间),以确保脚本不会被我使用的服务器停止,即使根据我的测试,该脚本也会在没有ignore_user_abort()
and的情况下完成任务set_time_limit()
。
gearman
php来处理后台任务。如果您遇到大量的时间处理和繁重的工作,则非常适合扩展。您应该看看它。