在后台执行PHP脚本。。。对于我的案例,最好的解决方案是什么?
我正在为一家公司开发一个电子邮件发送系统,该系统必须插入CMS。我正在寻找一种方法,使电子邮件发送者脚本在后台运行,而管理员可以导航,甚至关闭浏览器 我找到了名为在后台执行PHP脚本。。。对于我的案例,最好的解决方案是什么?,php,background-process,Php,Background Process,我正在为一家公司开发一个电子邮件发送系统,该系统必须插入CMS。我正在寻找一种方法,使电子邮件发送者脚本在后台运行,而管理员可以导航,甚至关闭浏览器 我找到了名为ignore\u user\u abort()的PHP函数,它是保持页面运行所必需的,即使页面已超时 现在我有三种“启动脚本”的解决方案: 我可以用一个iframe 我可以使用一个Ajax调用,我之前已经将其配置为很早超时。例如:使用:$.ajaxSetup({timeout:1000}) 我可以使用cron作业,但我希望避免使用此解决
ignore\u user\u abort()
的PHP函数,它是保持页面运行所必需的,即使页面已超时
现在我有三种“启动脚本”的解决方案:
$.ajaxSetup({timeout:1000})代码>
谢谢您可以使用
Exec()
在后台运行PHP脚本
请举例说明如何做到这一点:
function execInBackground($cmd) {
if (substr(php_uname(), 0, 7) == "Windows"){
pclose(popen("start /B ". $cmd, "r"));
}
else {
exec($cmd . " > /dev/null &");
}
}
如果我是你,我会编写一个后台守护程序来完成这项工作。我会将所有电子邮件保存到原始HTTP调用中的数据库中,并在后台不断运行一个脚本,该脚本每30秒检查一次,看看是否有任何待处理的电子邮件,然后发送它们 这还允许您在向队列中添加电子邮件时检查重复项,因此您不必担心多次添加
编辑鉴于您不使用cron作业的原因(即您没有服务器的shell访问权限),我不会使用这种方法 相反,我将进行第一次AJAX调用,PHP将所有电子邮件插入数据库,并返回Javascript的一个键。然后,我将使用该键进行Javascript调用,PHP在其中处理电子邮件5秒钟,然后将剩余的电子邮件数返回到浏览器。然后我会让Javascript不断重复这个请求,直到没有剩余的电子邮件
这还有一个额外的好处,即您可以获得进度通知,如果服务器因任何原因崩溃,您的电子邮件将可以恢复。仅因为您关闭了浏览器,php启动的脚本就不应该停止执行。在我看来,有几种方法可以做到这一点:
用户是否必须按下按钮(或什么)才能开始发送过程?是的,他需要。编辑电子邮件内容并导入联系人列表后。他必须按下一个按钮。你可以使用你自己的建议,但在数据库中添加一些表示它正在运行的内容,或者标记一个tmp文件,甚至会话变量,以防止它在按f5时运行两次。在cron作业的上下文中,“virtual”到底意味着什么?如果您不能可靠地运行cron作业,那么这可能是需要解决的问题。我也不明白。但他们不久前告诉我,这是他们能安排跑步的唯一方法。我当时试图避免深入的信息,因为我不是网络管理员。我现在正在等待他们的答复。如果我得到更多关于为什么他们不使用常规cron系统的解释,我将在这里发布。但就目前而言,我知道他们的系统不是很好。在
exec()
中执行的PHP脚本运行时,页面会冻结吗?@Cybrix不,这就是重点。通过此函数运行的命令将在后台运行,因此用户可以自由离开页面,而不必等待命令变为芬兰语。我已经联系了技术支持,看看我(或者更具体地说是脚本)是否允许使用exec()命令。我会随时向你通报最新情况。已经确认我可以使用该解决方案。谢谢。你能再解释一下吗?@Cybrix不,这是一个shell命令。由于您似乎不能使用shell命令,我将使用刚才在编辑中详细介绍的方法。谢谢您提供的解决方案,但用户必须能够离开页面或关闭浏览器。@Cybrix很公平。在这种情况下,我会使用Jan的方法。