【问题标题】:Abort cURL in a ajax request在 ajax 请求中中止 cURL
【发布时间】:2012-12-01 12:32:11
【问题描述】:

我正在向 ajax.php 文件发送 Ajax 请求,该文件使用 cURL 下载 XML。

//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 请求是一个很好的临时解决方案,但不知道该怎么做。

注意: Ajax 请求已使用 jQuery 设置并中止它ajax.abort() 并没有解决问题。

【问题讨论】:

  • 你知道你可以回答你自己的问题,对吧?
  • @wormhit 完成朋友!但它对我有什么帮助?
  • 很多用户一看到回答率低就没有回答问题。您正在失去真正会调查您的问题的用户。我不是在评判你或任何事情。只是信息。
  • @wormhit You're mistaken

标签: php ajax jquery curl


【解决方案1】:

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

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

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

【讨论】:

  • 我想你不明白问题出在哪里。可能是我的问题没有解决。我不担心ajax请求结果或任何会话,导致我的程序出现问题的是调用ajax的网页,它不会在ajax请求正在处理时刷新。
【解决方案2】:

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

【讨论】:

  • 我还是要等 cURL 请求,try/catch 没用
猜你喜欢
  • 1970-01-01
  • 2020-04-05
  • 2011-03-07
  • 2015-12-06
  • 2015-03-08
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
相关资源
最近更新 更多