我想取消cURL请求。当用户离开页面时,应该取消该请求。
情况说明:我们向移动支付终端发送cURL请求以开始新的付款。由于我们正在等待客户输入密码,因此请求仍处于暂挂状态。输入密码后,将以成功/失败的方式回答请求。我们想取消从服务器到支付终端的请求,例如,当客户想要现金支付时。
我们尝试了不同的方法,例如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);
答案 0 :(得分: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 )
但我真的建议你重新思考你在做什么。在不合适时使用系统调用可能会产生很多不好的事情,所以如果沿着这条路走下去,请确保你序列化,清理并逃避正确发送的数据!