提交表单后,如何在后台运行 PHP 脚本?

2022-08-30 07:27:02

问题
我有一个表单,在提交时,它将运行基本代码来处理提交的信息,并将其插入数据库以在通知网站上显示。此外,我还有一个已注册通过电子邮件和短信接收这些通知的人员列表。这个列表是微不足道的(只推动大约150个),但是它足以导致在整个订阅者表中循环并发送150 +电子邮件需要一分钟以上。(由于大量电子邮件策略,电子邮件将根据我们电子邮件服务器的系统管理员的要求单独发送。

在此期间,发布警报的个人将在表单的最后一页上停留近一分钟,而不会有任何积极的强化,即他们的通知正在发布。这导致了其他潜在的问题,所有那些有可能的解决方案,我觉得都不太理想。

  1. 首先,发帖人可能会认为服务器滞后,再次单击“提交”按钮,导致脚本重新开始或运行两次。我可以通过使用JavaScript禁用按钮并替换文本来解决此问题,例如“正在处理...”,但是这并不理想,因为用户仍然会卡在脚本执行期间的页面上。(另外,如果禁用了 JavaScript,则此问题仍然存在。

  2. 其次,海报可能会在提交表单后过早关闭选项卡或浏览器。脚本将继续在服务器上运行,直到它尝试写回浏览器,但是如果用户随后浏览到我们域中的任何页面(当脚本仍在运行时),浏览器将挂起加载页面,直到脚本结束。(仅当浏览器的选项卡或窗口关闭而不是整个浏览器应用程序时,才会发生这种情况。尽管如此,这仍然不太理想。

(可能)解决方案
我决定要将脚本的“电子邮件”部分分解为一个单独的文件,我可以在通知发布后调用。我最初想过在成功发布通知后将其放在确认页面上。但是,用户将不知道此脚本正在运行,并且任何异常对他们来说都不明显;此脚本不能失败。

但是,如果我可以将此脚本作为后台进程运行,该怎么办?所以,我的问题是:如何执行PHP脚本作为后台服务触发,并完全独立于用户在表单级别执行的操作运行?

编辑:不能被控告。它必须在提交表单的那一刻运行。这些是高优先级通知。此外,运行我们服务器的系统管理员不允许 crons 运行频率超过 5 分钟。


答案 1

做一些实验,我发现了一个完美的解决方案!我选择使用,以便我可以记录发生(或未发生)的每个通知过程。( 以字符串形式返回,这比使用 更容易,将输出分配给变量,然后打开要写入的文件。execshell_execshell_execshell_execexec

我使用以下行来调用电子邮件脚本:

shell_exec("/path/to/php /path/to/send_notifications.php '".$post_id."' 'alert' >> /path/to/alert_log/paging.log &");

重要的是要注意命令末尾的(如@netcoder所指出的那样)。此 UNIX 命令在后台运行进程。&

脚本路径后用单引号括起来的额外变量被设置为我可以在脚本中调用的变量。$_SERVER['argv']

然后,电子邮件脚本使用 输出到我的日志文件,并将输出如下内容:>>

[2011-01-07 11:01:26] Alert Notifications Sent for http://alerts.illinoisstate.edu/2049 (SCRIPT: 38.71 seconds)
[2011-01-07 11:01:34] CRITICAL ERROR: Alert Notifications NOT sent for http://alerts.illinoisstate.edu/2049 (SCRIPT: 23.12 seconds)

答案 2

在 Linux/Unix 服务器上,可以使用proc_open在后台执行作业:

$descriptorspec = array(
   array('pipe', 'r'),               // stdin
   array('file', 'myfile.txt', 'a'), // stdout
   array('pipe', 'w'),               // stderr
);

$proc = proc_open('php email_script.php &', $descriptorspec, $pipes);

这是这里重要的一点。即使原始脚本已结束,脚本仍将继续。&


推荐