我正在向使用cURL下载XML的ajax.php
文件发送Ajax请求。
//ajax.php
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERPWD, USERNAME.':'.PASSWORD);
curl_setopt($ch, CURLOPT_POSTFIELDS, getData());
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
$data = curl_exec($ch);
echo $data;
用户未确认此过程,可能会刷新网页。
有时候curl_exec($ch)
需要很长时间才会出现timeout
错误。此错误会阻止脚本继续。我搜索并找不到解决这个问题的确切解决方案。
现在更大的问题是,在这种情况下,当ajax请求在后台处理并且用户刷新页面时,它不会刷新,直到ajax请求超时或结束。
我认为在刷新页面时中止该cURL请求是一个很好的临时解决方案,但不知道该怎么做。
注意:使用jQuery设置Ajax请求并中止它ajax.abort()
没有解决问题。
答案 0 :(得分:0)
您应该更改应用程序处理此功能的方式。 我会尝试在ajax调用和实际计算过程之间放置另一个抽象层。
例如,ajax调用可以初始化php后台进程或甚至更好的中间件消息队列与worker。作为响应,您向客户提供作业ID(或将其存储在与用户ID链接在一起的数据库中)。然后onTimeout()正在执行ajax请求以获取作业状态。与此同时,后台进程或中间件工作者正在处理任务并将响应保存到具有相同作业ID的db中。
因此,最终客户初始化工作,之后只检查该工作的状态。作业完成后,您就会知道它在服务器端。因此,在下一个ajax请求中,您将回复实际的工作结果。 Javascript正在接收带有结果的响应,并且正在执行在客户端继续工作的回调函数。
答案 1 :(得分:-1)
您可以尝试使用try / catch块返回在发生此(或其他)错误时可以处理的内容。