首页 > 解决方案 > 使用 Promise 循环运行 Ajax

问题描述

我必须处理一个巨大的列表,并且我正在尝试分别循环使用该列表的每个项目,以避免出现 PHP 最大执行时间错误:

function syncCgiu(form_data, response) {
    let promises = [];
    $.each(response.content, function(index, value){
        const data = form_data+'&action=sync_cgiu&lookup='+value;
        promises.push(
            $.post(ajaxurl, data, function(){
                console.log(value + 'imported');
            })
        );
    });

    Promise.all(promises).then(function() {
        console.log('finish import');
    });
});

在某些时候,控制台开始显示错误:

加载资源失败:net::ERR_INSUFFICIENT_RESOURCES

加载资源失败:服务器响应状态为 504 ()

并且 PHP 停止运行该函数。

标签: phpjqueryajax

解决方案


根据对上述问题的评论......

您要发送多少个请求?

超过20k

你正在DOS -ing 你自己的服务器。让一个页面快速连续发送数万个请求是一件坏事。这应该通过单个请求进行批量处理。在您提到的问题中:

我正在尝试分别循环使用此列表的每个项目,以避免出现PHP 最大执行时间错误

这是因为等待数以万计的记录被处理也是不理想的。相反,请离线处理它们。考虑如下场景:

  • 在单个请求中上传要处理的所有数据。保存数据并向用户返回指示处理已开始的响应。
  • 有一个离线进程(CRON 作业或服务器上的某个后台进程)监视“保存位置”(数据库?目录?)以处理新记录。当它看到这些新记录时,它开始处理它们。
  • 完成后,某个标志会保存在某处,指示处理已完成,否则会通知用户。
  • 当结果可用时,用户可以查看/下载结果。

例如,考虑将所有记录立即写入数据库。在该表中包含一列,指示记录是否已被处理。您的 CRON 作业或后台进程只是定期检查表中未处理的记录并处理它们。当每一个完成时,更新标志以指示完成。用户可以随时查看上传记录的进度。

基本上,不要仅仅依靠 HTTP 通信来满足大数据处理需求。太多的请求或太大的请求都会让你陷入困境。使大型流程脱机并保持 Web 应用程序响应用户。


推荐阅读