首页 > 解决方案 > 取消 cURL 请求

问题描述

我想取消一个 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);

标签: phpcurlcancellation

解决方案


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

你可以做什么:

您可以使用 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)

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


推荐阅读