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

时间:2010-11-12 15:45:43

标签: php background-process

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

我找到了名为ignore_user_abort()的PHP函数,即使它已经超时,也需要保持页面运行。

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

  1. 我可以使用iframe

  2. 我可以使用之前配置的Ajax调用来尽早超时。例如:使用jQuery framework$.ajaxSetup({ timeout: 1000 });

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

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

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

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

3 个答案:

答案 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启动的脚本不应该停止执行。所以我看到你有几种方法可以做到这一点:

  1. 向服务器发送POST,告诉您要执行某些操作,脚本会一直执行,直到完成为止。重新加载页面将警告浏览器您需要重新发送数据等...您可以使用javascript异步执行POST以防止此操作并在脚本执行时能够执行其他操作。这里需要注意的一点是脚本执行时间可能有限。

  2. 向脚本发送POST,然后脚本启动后台系统进程执行相同的操作。但是现在你将无法找到进度,除非你在某个地方,数据库或其他地方保存状态

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