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

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

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

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

(Possible) Solution

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

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

推荐答案

通过对execshell_exec进行一些实验,我发现了一个非常有效的解决方案!我 Select 使用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相关问答推荐

Shopware 6:无法在新的自定义插件中保存关联字段(媒体)

按数字然后按字符串对关联 PHP 数组进行排序

PHP - 如何获取发送到脚本的查询参数

将短代码添加到 woocommerce 产品页面

从数组 laravel 建立值的关系

我的 PHP/Mysql JSON 输出格式与 Flutter 应用所需的示例 JSON 页面格式不同

仅当我将 char 更改为1时,哪个 UPDATE 语句才能更改我的 TIMESTAMP? php、mysql

Xdebug xdebug.mode = 调试不适合我

在 ubuntu 上安装 php70-gd

使用 Composer 和 autoload.php 在 PHPUnit 中自动加载类

如何使用 facebook graph api 显示用户个人资料图片?

PHP:为什么 exec() 不返回输出?

获取在 PHP 中执行当前函数的代码行和文件?

如何使用 PHP 判断请求是否是 AJAX 请求

如何使用 MySQL SELECT 创建虚拟列?

artisan 迁移错误找不到类'Doctrine\\DBAL\\Driver\\PDOMySql\\Driver',

获取下周一、周二等日期

PHP 7.2 函数 create_function() 已弃用

将 SimpleXML 对象强制为字符串,无论上下文如何

phpexcel下载