Problem
我有一个表单,当提交时,将运行基本代码来处理提交的信息,并将其插入到数据库中,以便在通知网站上显示.此外,我还有一个通过邮箱和短信注册接收这些通知的人的名单.就目前而言,这个列表是微不足道的(只有150个左右),但它足以导致需要一分钟以上的时间才能浏览整个订阅表并发送150多封邮箱.(由于批量邮箱策略,我们的邮箱服务器的系统管理员要求单独发送邮箱.)

在此期间,发布alert 的个人将在表单的最后一页停留近一分钟,而不会有任何积极的补充说明他们的通知正在发布.这导致了其他潜在的问题,所有可能的解决方案我都觉得不太理想.

  1. 首先,海报可能会认为服务器落后,再次单击"提交"按钮,导致脚本重新启动或运行两次.我可以通过使用JavaScript禁用按钮来解决这个问题,并将文本替换为"处理…"之类的内容,然而,这并不理想,因为在执行脚本的过程中,用户仍然会被困在页面上.(此外,如果禁用了JavaScript,这个问题仍然存在.)

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

(Possible) Solution

但是,如果我可以运行这个脚本作为后台进程呢?所以,我的问题是:我如何执行一个PHP脚本来作为后台服务触发,并完全独立于用户在表单级别所做的操作来运行?

EDIT:cannot必须是cron'ed.它必须在表单提交时立即运行.这些是高优先级通知.此外,运行我们服务器的系统管理员不允许cron的运行频率超过5分钟.

推荐答案

通过对execshell_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']个变量,我可以在脚本中调用这些变量.

然后,邮箱脚本使用>>输出到我的日志(log)文件,并输出类似以下内容:

[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相关问答推荐

Clickatell 回复特定消息

来自带有 CONCAT 的 REGEXP 的“重复运算符操作数无效”

函数 hide_payment_gateways_based_on_weight 的严重未捕获错误

Laravel:当我想更新我的数据库时,参数太少而无法运行

为准备好的语句动态生成类型定义字符串

使用 PHP 将时间从数据库转换为 BST

如何验证没有要验证的特定属性的发布请求

PHP Carbon 不计算时差

如何判断返回的集合关系中是否存在变量

目标类控制器不存在 - Laravel 8

为什么我在引入属性类型提示时突然收到“在初始化之前不能访问类型属性”错误?

不推荐使用带有花括号的数组和字符串偏移访问语法

“页面因不活动而过期” - Laravel 5.5

无法通过composer 安装 laravel 安装程序

dyld:库未加载:/usr/local/lib/libjpeg.8.dylib - homebrew php

如何在没有 Composer 的情况下安装 Composer PHP 包?

使 PhpStorm 停止自动关闭选项卡

如何在不使用 Firebase 控制台的情况下发送 Firebase 云消息传递通知?

包 php5 没有安装候选(Ubuntu 16.04)

PHP - 为什么使用 Guzzle 而不是 cURL?