php - 使用 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 停止运行该函数。
解决方案
根据对上述问题的评论......
您要发送多少个请求?
超过20k。
你正在DOS -ing 你自己的服务器。让一个页面快速连续发送数万个请求是一件坏事。这应该通过单个请求进行批量处理。在您提到的问题中:
我正在尝试分别循环使用此列表的每个项目,以避免出现PHP 最大执行时间错误
这是因为等待数以万计的记录被处理也是不理想的。相反,请离线处理它们。考虑如下场景:
- 在单个请求中上传要处理的所有数据。保存数据并向用户返回指示处理已开始的响应。
- 有一个离线进程(CRON 作业或服务器上的某个后台进程)监视“保存位置”(数据库?目录?)以处理新记录。当它看到这些新记录时,它开始处理它们。
- 完成后,某个标志会保存在某处,指示处理已完成,否则会通知用户。
- 当结果可用时,用户可以查看/下载结果。
例如,考虑将所有记录立即写入数据库。在该表中包含一列,指示记录是否已被处理。您的 CRON 作业或后台进程只是定期检查表中未处理的记录并处理它们。当每一个完成时,更新标志以指示完成。用户可以随时查看上传记录的进度。
基本上,不要仅仅依靠 HTTP 通信来满足大数据处理需求。太多的请求或太大的请求都会让你陷入困境。使大型流程脱机并保持 Web 应用程序响应用户。
推荐阅读
- sql - PL/SQL 创建一个根据日期范围检查 SYSDATE 的触发器
- python - 在 jinja2 中访问烧瓶动态路由值
- function - Python - 函数中的变量未定义
- python - 如何使用 Python 从 Chrome 获取下载目录位置
- python - 无法验证电话号码是否在文件中
- python - @api。取决于或 @api.onchange 不适用于计算字段。为什么?
- c - 编译正则表达式:出现成功错误
- android - Android Studio 在手机上运行时忽略 layout-large
- methods - 如何通过函数指针调用方法?
- javascript - 在函数中调用时变量始终未定义