0

我正在向ajax.php使用 cURL 下载 XML 的文件发送 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()并没有解决问题。

4

2 回答 2

0

您应该更改应用程序处理此功能的方式。我会尝试在 ajax 调用和实际计算过程之间放置另一个抽象层。

例如,ajax 调用可以初始化 php 后台进程,甚至可以使用 worker 初始化更好的中间件消息队列。作为回应,您提供客户工作 ID(或将其存储在与用户 ID 链接在一起的数据库中)。然后 onTimeout() 正在执行 ajax 请求以获取作业状态。与此同时,后台进程或中间件工作人员正在处理任务并将响应保存到具有相同作业 ID 的数据库中。

所以最终客户初始化工作,然后检查该工作的状态。工作完成后,您在服务器端就知道了。因此,在下一个 ajax 请求中,您会以实际的工作结果进行响应。Javascript 正在接收带有结果的响应,并正在执行回调函数,该函数正在客户端继续工作。

于 2012-12-03T14:24:03.407 回答
-1

您可以尝试使用 try/catch 块来返回可以在发生此(或其他)错误时处理的内容。

于 2012-12-01T12:38:59.410 回答