- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
问题
我有一个表单,当提交时,它将运行基本代码来处理提交的信息并将其插入数据库以显示在通知网站上。此外,我还有一份已注册通过电子邮件和 SMS 消息接收这些通知的人员列表。该列表目前微不足道(仅推送约 150 条),但足以导致需要一分钟以上的时间来循环浏览整个订阅者表并发送 150 多封电子邮件。 (由于邮件群发政策,我们的电子邮件服务器的系统管理员要求这些电子邮件是单独发送的。)
在此期间,发布警报的个人将在表单的最后一页停留近一分钟,而没有任何积极强化他们的通知正在发布。这会导致其他潜在问题,所有可能的解决方案我都觉得不太理想。
首先,发帖者可能认为服务器滞后并再次单击“提交”按钮,导致脚本重新开始或运行两次。我可以通过使用 JavaScript 禁用按钮并将文本替换为“处理中...”之类的内容来解决此问题,但这并不理想,因为用户仍会在脚本执行期间卡在页面上。 (另外,如果 JavaScript 被禁用,这个问题仍然存在。)
其次,发帖人可能会在提交表单后过早关闭标签页或浏览器。脚本将继续在服务器上运行,直到它尝试写回浏览器,但是如果用户随后浏览到我们域中的任何页面(当脚本仍在运行时),浏览器会挂起加载页面,直到脚本结束. (这只发生在浏览器的一个选项卡或窗口关闭时,而不是整个浏览器应用程序关闭时。)不过,这并不理想。
(可能的)解决方案
我决定将脚本的“电子邮件”部分拆分为一个单独的文件,以便在发布通知后调用。我本来想在通知成功发布后将其放在确认页面上。但是,用户不会知道这个脚本正在运行,并且任何异常对他们来说都不会很明显;此脚本不会失败。
但是,如果我可以将此脚本作为后台进程运行呢?所以,我的问题是:如何执行 PHP 脚本以作为后台服务触发并完全独立于用户在表单级别执行的操作?
编辑:这个不能被cron'ed。它必须在表单提交的那一刻运行。这些是高优先级通知。此外,运行我们服务器的系统管理员不允许 cron 运行频率超过 5 分钟。
最佳答案
用 exec
和 shell_exec
做一些实验我发现了一个完美的解决方案!我选择使用 shell_exec
这样我就可以记录每个发生(或不发生)的通知过程。 (shell_exec
作为字符串返回,这比使用 exec
更容易,将输出分配给变量,然后打开要写入的文件。)
我正在使用以下行来调用电子邮件脚本:
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)
关于php - 提交表单后如何在后台运行 PHP 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4626860/
我有 powershell 脚本。通过调度程序,我运行 bat 文件,该文件运行 PS1 文件。 BAT文件 Powershell.exe -executionpolicy remotesigned
什么更快? 或者 $.getScript('../js/SOME.js', function (){ ... // with $.ajaxSetup({ cache: true });
需要bash脚本来显示文件 #!/bin/bash my_ls() { # save current directory then cd to "$1" pushd "$1" >/dev/nu
我有一个输入 csv 文件,实际上我需要在输入文件中选择第 2 列和第 3 列值,并且需要转换两个值的时区(从 PT 到 CT),转换后我需要替换转换后的时区值到文件。 注意: 所有输入日期值都在太平
我正在使用/etc/init.d/httpd 作为 init.d 脚本的模板。我了解文件中发生的所有内容,但以下行除外: LANG=$HTTPD_LANG daemon --pidfile=${pid
我有以下选择: python runscript.py -O start -a "-a "\"-o \\\"-f/dev/sda1 -b256k -Q8\\\" -l test -p maim\""
我对 shell 脚本完全陌生,但我需要编写一个 shell 脚本来检查文件是否存在,然后移动到另一个位置 这是我写的: 一旦设备崩溃,我就会在/storage/sdcard1/1 中收集日志 #!/
我正在使用 bash 脚本从文本文件中读取数据。 数据: 04:31 Alex M.O.R.P.H. & Natalie Gioia - My Heaven http://goo.gl/rMOa2q
这是单击按钮时运行的 javascript 的结尾 xmlObj.open ('GET', /ajax.php, true); xmlObj.send (''); } 所以这会执行根目录中的php脚本
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我需要将文件转换为可读流以通过 api 上传,有一个使用 fs.createReadStream 的 Node js 示例。任何人都可以告诉我上述声明的 python 等价物是什么? 例子 const
我有一个 shell 脚本 cron,它从同一目录调用 python 脚本,但是当这个 cron 执行时,我没有从我的 python 脚本中获得预期的输出,当我手动执行它时,我的 python 脚本的
如何使 XMLHttpRequest (ajax) 调用的 php 脚本安全。 我的意思是,不让 PHP 文件通过直接 url 运行,只能通过脚本从我的页面调用(我不想向未登录的用户显示数据库结果,并
我正在尝试添加以下内容 我正在使用经典的 asp。但我不断收到的错误是“一个脚本 block 不能放在另一个脚本 block 内。”我尝试了此处的 document.write 技术:Javasc
如何从另一个 PHP 脚本(如批处理文件)中运行多个 PHP 脚本?如果我了解 include 在做什么,我认为 include 不会起作用;因为我正在运行的每个文件都会重新声明一些相同的函数等。我想
我想创建具有动态内容的网页。我有一个 HTML 页面,我想从中调用一个 lua 脚本 如何调用 lua 脚本? ? ? 从中检索数据?我可以做类似的事情吗: int xx = 0; xx
我删除了我的第一个问题,并重新编写了更多细节和附加 jSfiddle domos。 我有一个脚本,它运行查询并返回数据,然后填充表。表中的行自动循环滚动。所有这些工作正常,并通过使用以下代码完成。然而
我尝试使用 amp 脚本,但收到此错误: “[amp-script] 脚本哈希未找到。amp-script[script="hello-world"].js 必须在元[name="amp-script
我有一个读取输入的 Shell 脚本 #!/bin/bash echo "Type the year that you want to check (4 digits), followed by [E
我正在从 nodejs 调用 Lua 脚本。我想传递一个数组作为参数。我在 Lua 中解析该数组时遇到问题。 下面是一个例子: var script = 'local actorlist = ARGV
我是一名优秀的程序员,十分优秀!