【问题标题】:Stop AJAX XHR call but still continue with PHP停止 AJAX XHR 调用,但仍继续使用 PHP
【发布时间】:2019-01-17 13:16:22
【问题描述】:

下午好,

我有以下功能可以显示和隐藏页面繁忙的加载器:

busyStatusDelay = 1000; //milliseconds
var timer = null;
var show = false;

function busyShow(nodelay,delay) {
    timer = setTimeout('busyDelayShow()',busyStatusDelay);
}

function busyDelayShow() {
    if ($.active > 0) {
        $('#json-overlay').css('display', 'table');
        show = true;
    }
}

function busyHide() {
    clearTimeout(timer);
    timer = null;
    show = false;
    $('#json-overlay').css('display', 'none');
}

这对于普通的 ajax 查询非常有用,但是我们有一个新功能应该使用 SMTP 发送电子邮件,但是这个 SMTP 连接需要几秒钟的时间来连接和发送电子邮件。

为了避免这种情况,我希望 ajax 函数不触发此加载器,该函数不会调用该函数来打开加载器,但问题是当调用另一个应该打开加载器的函数时,它会在那里拾取是一个活动连接,因此加载程序会重新启动并且不会消失。

我尝试使用以下内容,以便 JS 不会将其视为活动请求:

xhr.abort(); busyHide();

但是当 ajax 中止时,php 也会随之中止。

请注意,发送电子邮件的功能应在后台运行,不应等待响应。

我一直在寻找一种在不影响服务器功能运行和发送邮件的情况下断开服务器请求的方法。

我在另一篇文章中看到了ignore_user_abort,因此将对此进行一些阅读,看看这是否可以在不影响系统其余部分的情况下工作。

提前感谢有关如何继续的任何提示!

【问题讨论】:

    标签: javascript php ajax xmlhttprequest


    【解决方案1】:

    解决此问题的一个好方法是使用某种排队机制将 SMTP 作为后台进程执行。所以基本上,每当 JS 触发 AJAX 发送邮件时,PHP 都会将电子邮件请求推送到队列并立即将响应发送回 XHR。这样,您的 AJAX 执行将不会被长时间阻塞。 如果您正在使用某种 PHP 框架,例如 Laravel,则可以更轻松地管理队列,否则请查看 this post.

    【讨论】:

    • 感谢您的回答,将阅读有关如何创建队列的信息。我正在使用 CodeIgniter 2。我也想过调用该函数以在 shell 或 curl 函数中发送电子邮件,但经验为零,因此需要检查如何使用两者之一发布到 url。
    • 如果您的解决方案在 Linux 机器、RHEL 或 Ubuntu 上运行,它已经带有一个邮件队列系统。您所要做的就是设置它。这里的主要目的是避免阻塞主线程和运行队列是实现相同目的的最佳方法,并且始终被推荐。
    • 我们正在运行 CentOS,所以仍然是一台 Linux 机器,但是我无法访问机器的配置,但会询问可以提供帮助的人。
    • 在 CentOS 中,您为邮件队列解决方案设置了类似 Postfix 的东西。由于您提到您无法直接控制您的机器,因此我建议您设置一些 PHP 排队系统并使用它。但无论哪种方式,您都可以实现您的目标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多