【发布时间】:2011-06-05 08:09:54
【问题描述】:
问题
我有一个表单,当提交时,它将运行基本代码来处理提交的信息并将其插入数据库以显示在通知网站上。此外,我还有一份已注册通过电子邮件和 SMS 消息接收这些通知的人员列表。该列表目前微不足道(仅推送大约 150 条),但足以导致需要一分钟以上的时间来循环浏览整个订阅者表并发送 150 多封电子邮件。 (由于邮件群发政策,我们的电子邮件服务器的系统管理员要求这些电子邮件单独发送。)
在此期间,发布警报的个人将在表单的最后一页停留近一分钟,而没有任何积极强化他们的通知正在发布。这会导致其他潜在问题,所有可能的解决方案我都觉得不太理想。
首先,发帖者可能认为服务器滞后并再次单击“提交”按钮,导致脚本重新开始或运行两次。我可以通过使用 JavaScript 禁用按钮并将文本替换为“处理中...”之类的内容来解决此问题,但这并不理想,因为在脚本执行期间用户仍会卡在页面上。 (另外,如果 JavaScript 被禁用,这个问题仍然存在。)
其次,发帖人可能会在提交表单后过早关闭选项卡或浏览器。脚本将继续在服务器上运行,直到它尝试写回浏览器,但是如果用户随后浏览到我们域中的任何页面(脚本仍在运行时),浏览器会挂起加载页面,直到脚本结束. (这只发生在浏览器的一个选项卡或窗口关闭时,而不是整个浏览器应用程序关闭时。)不过,这并不理想。
(可能的)解决方案
我决定将脚本的“电子邮件”部分拆分为一个单独的文件,以便在发布通知后调用。我本来想在通知成功发布后将其放在确认页面上。但是,用户不会知道这个脚本正在运行,并且任何异常对他们来说都不会很明显;此脚本不会失败。
但是,如果我可以将此脚本作为后台进程运行呢?所以,我的问题是:如何执行 PHP 脚本以作为后台服务触发并完全独立于用户在表单级别执行的操作?
编辑:这个不能被cron'ed。它必须在表单提交的那一刻运行。这些是高优先级通知。此外,运行我们服务器的系统管理员不允许 crons 运行频率超过 5 分钟。
【问题讨论】:
-
启动一个 cron 作业并在另一个页面上提醒用户他们的请求正在处理中,或者类似的东西。
-
您想定期(每天或每小时)运行它还是在提交时运行它?我想你可以使用 php 的
exec()但我从未尝试过。 -
我只是使用
ajax并在循环内插入带有时间间隔的sleep()(我在我的情况下使用foreach)来运行后台进程。它在我的服务器上完美运行。不确定其他人。我还在循环之前添加ignore_user_abort()和set_time_limit()(计算结束时间),以确保脚本不会被我使用的服务器停止,即使根据我的测试,脚本在没有@的情况下完成任务987654327@ 和set_time_limit(). -
我看到你已经想出了一个解决方案。我使用
gearman和php 来处理后台任务。如果您遇到大量时间处理和繁重的负载,它是完美的扩展。你应该看看它。 -
在[stackoverflow](stackoverflow.com/a/46617107/6417678)上关注这个答案
标签: php scripting background