【问题标题】:Process an ajax function while an ajax function在 ajax 函数的同时处理 ajax 函数
【发布时间】:2012-05-11 20:34:05
【问题描述】:

我有一个发送 X 封邮件的 PHP 进程 每次发送邮件后,我在数据库中添加一行以告知已发送邮件。

所以,我不想创建一个进度条来告诉用户 X 邮件是在 Y 上发送的(Y = 总数)

我有两个这样的 jquery 函数:

function mail_send()
{
    var refreshIntervalId;
    $('.loading').css('display','block');
    $.ajax({
        'url': '/an/url/', 
        'data': {
                    someParam: param
                },
        'beforeSend':function()
                    {
                        $('#loadingBg').append('<span id="count"></span>');
                        refreshIntervalId =setInterval(function () {
                            mail_updateProgress(id);
                        }, 500);
                    }

        , 
        'success':  function (data,textStatus)
                    {
                       (....)
                       clearInterval(refreshIntervalId);
                       javascript: console.log(' send finish !!!');
                    }
    });
}

function mail_updateProgress(id) {
    javascript: console.log('updatePG');
    $.ajax({
        'url': '/an/url/', 
            'data': {
                        someParam: param
                    },
        'success':  function (data) {
                        var res = $.parseJSON(data);
                        javascript: console.log('  => data received ' + res.nbSended);
                        $('#count').html(res.nbSended + '/' + res.total);
                    }
    });
}

$.ajax 有队列吗?我正在登录 3 件事:第一:当进程进入 updateProgress 函数时第二:当 updateProgress ajax 成功时第三:当 mail_send() ajax 成功时

日志的顺序是:

  • updatePG => 100 次(我已经在我的 php 代码中休眠以进行测试)
  • 发送完成!!! => 1 次
  • => 收到数据 11 => X 次(我发送了 11 封邮件)

所以对我来说,它告诉我有一个 ajax 调用队列。但是我怎样才能执行我的进度条呢?

编辑: 可能是php配置问题,

谁能告诉我如何允许来自同一进程的多连接?

【问题讨论】:

  • 我不完全理解您需要什么,但也许您可以创建一个文本文件,其中 PHP 脚本写入进度和一个 Ajax 函数来重复检查此文件并显示进度?
  • 这是同一个问题,如何同时执行一个 $.ajax() 函数而不是另一个! :s
  • 设置的时间间隔被写入! #jquery irc 的某个人告诉我看我的 apache 是否可以执行多进程,我会检查
  • Ricardo Lohmann :问题是“如何同时执行两个 ajax 请求?”

标签: php ajax apache jquery


【解决方案1】:

您可能会遇到这样的问题,即 Web 浏览器被设计为对任何域运行的并发 Web 请求不超过 2 个。您正在尝试使用此功能填充这两个插槽。在不了解有关您正在构建的应用程序的更多信息的情况下,具体而言,这就是我现在所能猜测的全部内容。

我认为,更好的方法是考虑终止您的邮件发送请求的客户端连接,并在客户端终止之后继续该过程。这将为您的浏览器释放一个 http 请求槽,并且应该允许您的 mailProgress ajax 函数继续按写入运行,而不必担心队列等问题。

这是另一个关于忽略客户端终止的 Stack Overflow 问题:Can a PHP script continue running after ending the HTTP request?

还有一篇博文,其中包含有关如何操作的更多详细信息(也链接在上述 Stack Overflow 问题中):http://waynepan.com/2007/10/11/how-to-use-ignore_user_abort-to-do-process-out-of-band/

希望对您有所帮助。

【讨论】:

  • 所以,我必须“停止”我的 mail_send() 函数并让另一个函数运行直到值等于 100% ?
  • 您的 mail_send 请求不是一个长时间运行的 HTTP 请求,而是一个触发您的脚本发送电子邮件的请求。您有一个进度检查脚本,因此可以使用它来为您的应用程序触发 onComplete 事件。 mail_send 请求仍然在服务器上运行,只是客户端不再直接附加到它。
  • 好的,看起来很不错,但是我可以用什么来“忘记”附件?因为 $.get 会附加到 ?
  • 我添加了我的答案的链接,向您展示如何做到这一点。您在服务器端终止连接,而不是客户端
  • $response = json_encode(array('success' =&gt; true)); ignore_user_abort(true); header("Connection: close"); header("Content-Length: " . mb_strlen($response)); echo $response; flush(); //rest of the mailing code
【解决方案2】:

我想你在找$.done()

【讨论】:

  • 问题是不显示进度条,问题是显示这个进度条的值(即:13/124)
  • 使用我的代码,我只能显示 11/11,因为我的 mail_updateProgress() 函数的 $.ajax:success 是在 mail_send() 函数之后调用的,而不是在它期间调用!您的`$('.loading').html('1/2 功能完成!仍在工作...');` 必须在所有完成时调用,并在此过程中调用$('.loading').html('Done!');。可能很难理解,对不起:s
猜你喜欢
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 2014-04-19
  • 2017-03-11
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 2018-07-13
相关资源
最近更新 更多