我正在开发一个电子邮件系统,我必须为公司插入CMS。我正在寻找一种方法让电子邮件发件人脚本在后台运行,而管理员可以导航甚至关闭浏览器。
我找到了名为ignore_user_abort()
的PHP函数,即使它已经超时,也需要保持页面运行。
现在我有三个“启动脚本”的解决方案:
我可以使用iframe
我可以使用之前配置的Ajax调用来尽早超时。例如:使用jQuery framework:$.ajaxSetup({ timeout: 1000 });
我可以使用cron作业,但我想避免使用此解决方案,因为它们是“虚拟”并且在该服务器上不稳定。
还有其他解决方案吗?我真的不喜欢iframe解决方案,但我已经将它们与Ajax上传器脚本一起使用了。
我不希望管理员点击 F5 并启动它的第二个实例。
该公司的用户被告知只使用Firefox登录CMS。 谢谢
答案 0 :(得分:10)
您可以使用Exec()
在后台运行PHP脚本。
php docs提供了一个如何做到这一点的示例:
function execInBackground($cmd) {
if (substr(php_uname(), 0, 7) == "Windows"){
pclose(popen("start /B ". $cmd, "r"));
}
else {
exec($cmd . " > /dev/null &");
}
}
答案 1 :(得分:0)
如果我是你,我会写一个背景守护进程来做到这一点。我会将所有电子邮件保存到原始HTTP调用中的数据库中,并在后台运行一个脚本,每隔30秒检查一次,看是否有任何待处理的电子邮件,然后发送它们。
这也允许您在向队列添加电子邮件时检查重复项,因此您无需担心多次添加。
编辑鉴于您不使用cron作业的原因(即您没有对服务器的shell访问权限),我不会使用此方法。
相反,我会进行第一次AJAX调用,其中PHP将所有电子邮件插入到数据库中,并返回一个密钥到Javascript。然后,我将使用该密钥进行Javascript调用,其中PHP处理电子邮件5秒钟,然后返回剩余的电子邮件数量到浏览器。然后,我会让Javascript继续重复此请求,直到没有剩余电子邮件。
这样可以获得进度通知的额外好处,如果服务器因任何原因而崩溃,您的电子邮件将是可恢复的。
答案 2 :(得分:0)
因为你关闭浏览器,php启动的脚本不应该停止执行。所以我看到你有几种方法可以做到这一点:
向服务器发送POST,告诉您要执行某些操作,脚本会一直执行,直到完成为止。重新加载页面将警告浏览器您需要重新发送数据等...您可以使用javascript异步执行POST以防止此操作并在脚本执行时能够执行其他操作。这里需要注意的一点是脚本执行时间可能有限。
向脚本发送POST,然后脚本启动后台系统进程执行相同的操作。但是现在你将无法找到进度,除非你在某个地方,数据库或其他地方保存状态
Cron(您似乎已经探索过这个选项)