【发布时间】:2020-12-30 21:49:59
【问题描述】:
我知道这是重复的问题。我尝试了 stackoverflow.com 的所有解决方案,但无法解决。
这是非常随机的行为。当php curl post 到目标服务器 api 时,有时相同的请求会两次发布到目标。我检查了源 php 是否已刷新,但 php 未刷新。我注意到的另一件奇怪的事情是,我只收到curl output 的重新发布请求。我没有收到第一个原始请求的 curl output。
$curl_unit = curl_init($URL);
curl_setopt($curl_unit, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl_unit, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl_unit, CURLOPT_POST, 1);
curl_setopt($curl_unit, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($curl_unit, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_unit, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl_unit, CURLOPT_INTERFACE, gethostbyname($_SERVER['HTTP_HOST']));
curl_setopt($curl_unit, CURLOPT_REFERER, $_SERVER['HTTP_HOST']);
curl_setopt($curl_unit, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
$curl_output = curl_exec($curl_unit);
$code = curl_getinfo($curl_unit, CURLINFO_HTTP_CODE);
curl_close($curl_unit);
SaveMyLog("DATA RECEIVED FROM destination: \r\n" . $curl_output . "\r\n Http code response: " . $code . "\r\n");
上述代码是项目所有php页面中curl的通用代码。
后来我在stackoverflow上找到了一些解决方案时尝试了不同的curl代码。以下是新的 curl 代码,有时也无法正常工作,并且会发生相同的随机奇怪行为。
$curl_unit = curl_init($URL);
curl_setopt($curl_unit, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl_unit, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl_unit, CURLOPT_POST, 1);
curl_setopt($curl_unit, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($curl_unit, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($curl_unit, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl_unit, CURLOPT_INTERFACE, gethostbyname($_SERVER['HTTP_HOST']));
curl_setopt($curl_unit, CURLOPT_REFERER, $_SERVER['HTTP_HOST']);
curl_setopt($curl_unit, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
ob_start();
curl_exec($curl_unit);
$code = curl_getinfo($curl_unit, CURLINFO_HTTP_CODE);
curl_close($curl_unit);
$curl_output = ob_get_contents();
ob_end_clean();
SaveMyLog("DATA RECEIVED FROM destination: \r\n" . $curl_output . "\r\n Http code response: " . $code . "\r\n");
ob_end_flush();
请注意 $URL 和 $postdata 已定义。
SaveMyLog 函数用于记录目的。
function SaveMyLog($lin, $deprecated = 'mylog.log')
{
$logid = '';
$date = getdate();
$fileName = basename($_SERVER['SCRIPT_FILENAME']);
$file = str_replace('.php', '', $fileName);
$logfile = $file . "_" . $date['year'] . "-" . $date['mon'] . "-" . $date['mday'] . ".log";
$fd = fopen('./logs/application_logs/' . $logfile, 'a+');
fwrite($fd, date('Y-m-d H:i:s') . $logid . "\t" . $lin . "\n");
fclose($fd);
@chmod('../logs/application_logs/' . $logfile, 0666);
}
【问题讨论】:
-
如何使用 TOKENS(在表单中用于发布数据)来防止发送两次表单(然后可以使用 curl 调用 2 次相同的 url)?阅读此stackoverflow.com/questions/14753148/… 可能是错误。
-
尝试将
CURLOPT_RETURNTRANSFER设置为true。curl_setopt($curl_unit, CURLOPT_RETURNTRANSFER, 1); -
这可能会为您提供更多信息:
print curl_error($curl_unit);- 将其放在 curl_exec 之后 -
@JustOnUnderMillions 我认为 TOKEN 在刷新时会很有用。但这不是刷新的情况。
-
@JayBlanchard 我试过
curl_setopt($curl_unit, CURLOPT_RETURNTRANSFER, 1);,但问题仍然存在