4

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

我发现了一个名为 PHP 的函数ignore_user_abort(),它是保持页面运行所必需的,即使它已经超时。

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

  1. 我可以使用 iframe

  2. 我可以使用之前配置为很早就超时的 Ajax 调用。例如:使用jQuery 框架$.ajaxSetup({ timeout: 1000 });

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

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

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

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

4

3 回答 3

11

您可以使用Exec().

php 文档提供了一个关于如何做到这一点的示例:

function execInBackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
        pclose(popen("start /B ". $cmd, "r"));  
    } 
    else { 
        exec($cmd . " > /dev/null &");   
    } 
}
于 2010-11-12T15:51:12.993 回答
0

如果我是你,我会写一个后台守护进程来做到这一点。我会将我所有的电子邮件保存到原始 HTTP 调用中的数据库中,并在后台持续运行一个脚本,该脚本每隔 30 秒检查一次,看看是否有任何待处理的电子邮件,然后发送它们。

这还允许您在将电子邮件添加到队列时检查重复项,因此您不必担心多次添加。


编辑鉴于您不使用 cron 作业的原因(即您没有对服务器的 shell 访问权限),我不会使用这种方法。

相反,我将进行第一次 AJAX 调用,其中 PHP 将所有电子邮件插入数据库,并返回 Javascript 的密钥。然后,我将使用该键进行 Javascript 调用,PHP 在其中处理电子邮件 5 秒钟,然后将剩余的电子邮件数量返回给浏览器。然后我会让 Javascript 不断重复这个请求,直到没有剩余的电子邮件。

这将具有额外的好处,您可以获得进度通知,并且如果服务器因任何原因崩溃,您的电子邮件将可以恢复。

于 2010-11-12T15:57:19.027 回答
0

仅仅因为您关闭浏览器,由 php 启动的脚本不应停止执行。因此,在我看来,您有几种方法可以做到这一点:

  1. 发送一个 POST 到服务器,告诉它你想做一些动作,脚本会一直执行直到它完成。重新加载页面将警告浏览器您需要重新发送数据等...您可以使用 javascript 异步执行 POST 以防止这种情况发生,并能够在脚本执行时执行其他操作。这里要注意的一件事是脚本执行时间可能会受到限制。

  2. 将 POST 发送到脚本,该脚本反过来启动后台系统进程执行相同的操作。但是现在除非您将状态保存在某个地方,数据库或其他东西中,否则您将无法找到进度

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

于 2010-11-12T15:58:36.427 回答