【问题标题】:Cancel cURL request取消 cURL 请求
【发布时间】:2018-04-30 15:52:46
【问题描述】:

我想取消一个 cURL 请求。当用户离开页面时,请求应该被取消。

情况说明:我们正在向移动支付终端发送 cURL 请求以开始新的支付。由于我们正在等待客户输入 PIN 码,因此该请求仍处于待处理状态。输入 PIN 码后,请求将通过成功/失败来回答。例如,当客户想用现金付款时,我们想取消从服务器到支付终端的请求。

我们尝试了不同的方法,例如connection_aborted & ignore_user_abort 但没有什么能解决这个问题。

$dataString = json_encode($data);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $dataString);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
  'Content-Type: application/json',                                                        
  'Content-Length: ' . strlen($dataString)                                                                       
));
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_SSLCERT, certificateRoot.'/test.crt.pem');
curl_setopt($ch, CURLOPT_SSLKEY, certificateRoot.'/test.key.pem');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);

【问题讨论】:

  • 嗯?尽管知道客户尚未输入所有数据,但您还是发起了 HTTP 请求(通过 cURL)?你确定这就是结构的真正含义吗?此外,HTTP 请求不会无限期地挂起,它们最终会超时,并且无法为 same 请求提供更多信息。更可能的情况是发出请求,远程支付服务响应说它没有 PIN,然后您等待用户输入,然后您再次发送请求但使用 PIN。你所描述的听起来很奇怪,甚至是不可能的。
  • 请在您的问题中提供一些示例代码。就目前而言,您的问题过于开放,无法获得合理质量的答案。
  • @ADyson,实际上,请求确实有点复杂。我已经简化了方法。尽管如此,事实是我们将发送一个请求并且必须等待长达 30 秒。结果。
  • 如果客户尚未决定是支付卡还是现金,和/或输入所有相关信息(如 PIN 码),您为什么要发起请求?我不明白。是什么导致 Ajax 请求启动?
  • 好的,它的ajax。对我来说仍然很奇怪,因为您需要在服务器上配置非常高的超时。你不应该让 PHP 请求故意挂起,即使是轮询也不行。使用经典的 PHP+apache 设置对资源的要求非常高。

标签: php curl cancellation


【解决方案1】:

如果您确实需要这样做,这是我的建议。我确信您以错误的方式处理此集成,我真诚地建议您重新阅读提供给您的文档。

你可以做什么:

您可以使用 exec 调用来调用 curl 二进制文件,而不是在 PHP 中使用 cURL 绑定,获取 pid 并将其存储在会话中。

$json_body = escapeshellarg(json_encode($data));
$pid = shell_exec("(curl https://dodgy-payment-vendor.com/api/foobar -XPOST -d $json_body > /dev/null 2>/dev/null) & echo \$!");

然后当用户取消时,您只需终止进程。

posix_kill($pid, 9)(如果您没有 posix 扩展名,那么也许只需在您的特定操作系统下使用带有适当 kill 命令的另一个 shell_exec ......哦, echo $! 无法在 windows 下获取 PID)

但我真的建议你重新考虑你在做什么。在不合适的情况下使用系统调用可能会导致很多不好的事情,因此请确保您序列化、清理和转义如果您沿着这条路径正确发送的任何数据!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-03
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多