在后台执行PHP脚本。。。对于我的案例,最好的解决方案是什么?

在后台执行PHP脚本。。。对于我的案例,最好的解决方案是什么?,php,background-process,Php,Background Process,我正在为一家公司开发一个电子邮件发送系统,该系统必须插入CMS。我正在寻找一种方法,使电子邮件发送者脚本在后台运行,而管理员可以导航,甚至关闭浏览器 我找到了名为ignore\u user\u abort()的PHP函数,它是保持页面运行所必需的,即使页面已超时 现在我有三种“启动脚本”的解决方案: 我可以用一个iframe 我可以使用一个Ajax调用,我之前已经将其配置为很早超时。例如:使用:$.ajaxSetup({timeout:1000}) 我可以使用cron作业,但我希望避免使用此解决

我正在为一家公司开发一个电子邮件发送系统,该系统必须插入CMS。我正在寻找一种方法,使电子邮件发送者脚本在后台运行,而管理员可以导航,甚至关闭浏览器

我找到了名为
ignore\u user\u abort()
的PHP函数,它是保持页面运行所必需的,即使页面已超时

现在我有三种“启动脚本”的解决方案:

  • 我可以用一个iframe

  • 我可以使用一个Ajax调用,我之前已经将其配置为很早超时。例如:使用:
    $.ajaxSetup({timeout:1000})

  • 我可以使用cron作业,但我希望避免使用此解决方案,因为它们是“虚拟的”,并且在该服务器上不稳定

  • 还有其他解决办法吗?我真的不喜欢iframe解决方案,但我已经将它们与Ajax上传脚本一起使用了

    我不希望管理员点击F5启动第二个实例

    该公司的用户被告知只能使用Firefox登录CMS。
    谢谢

    您可以使用
    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启动的脚本就不应该停止执行。在我看来,有几种方法可以做到这一点:

  • 向服务器发送一个帖子,告诉它您想执行一些操作,脚本将一直执行到完成。重新加载页面将警告浏览器您需要重新发送数据等。。。您可以使用javascript异步执行POST,以防止出现这种情况,并能够在脚本执行时执行其他操作。这里需要注意的一点是,脚本执行时间可能有限

  • 向脚本发送帖子,该脚本反过来启动后台系统进程,执行相同的操作。但是现在,除非您将状态保存到某个地方(数据库或其他地方),否则您将无法了解进度

  • Cron(您似乎已经探索过这个选项)


  • 用户是否必须按下按钮(或什么)才能开始发送过程?是的,他需要。编辑电子邮件内容并导入联系人列表后。他必须按下一个按钮。你可以使用你自己的建议,但在数据库中添加一些表示它正在运行的内容,或者标记一个tmp文件,甚至会话变量,以防止它在按f5时运行两次。在cron作业的上下文中,“virtual”到底意味着什么?如果您不能可靠地运行cron作业,那么这可能是需要解决的问题。我也不明白。但他们不久前告诉我,这是他们能安排跑步的唯一方法。我当时试图避免深入的信息,因为我不是网络管理员。我现在正在等待他们的答复。如果我得到更多关于为什么他们不使用常规cron系统的解释,我将在这里发布。但就目前而言,我知道他们的系统不是很好。在
    exec()
    中执行的PHP脚本运行时,页面会冻结吗?@Cybrix不,这就是重点。通过此函数运行的命令将在后台运行,因此用户可以自由离开页面,而不必等待命令变为芬兰语。我已经联系了技术支持,看看我(或者更具体地说是脚本)是否允许使用exec()命令。我会随时向你通报最新情况。已经确认我可以使用该解决方案。谢谢。你能再解释一下吗?@Cybrix不,这是一个shell命令。由于您似乎不能使用shell命令,我将使用刚才在编辑中详细介绍的方法。谢谢您提供的解决方案,但用户必须能够离开页面或关闭浏览器。@Cybrix很公平。在这种情况下,我会使用Jan的方法。