【问题标题】:php curl post twicephp curl帖子两次
【发布时间】: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 设置为truecurl_setopt($curl_unit, CURLOPT_RETURNTRANSFER, 1);
  • 这可能会为您提供更多信息:print curl_error($curl_unit); - 将其放在 curl_exec 之后
  • @JustOnUnderMillions 我认为 TOKEN 在刷新时会很有用。但这不是刷新的情况。
  • @JayBlanchard 我试过curl_setopt($curl_unit, CURLOPT_RETURNTRANSFER, 1);,但问题仍然存在

标签: php curl


【解决方案1】:

您可以尝试使用 CSRF 令牌,每次请求后都会更改。

【讨论】:

    【解决方案2】:

    从您的代码中,我看不出它为什么会表现得如此奇怪。

    所以可能还有其他问题。如果您从浏览器调用脚本,请确保浏览器只调用一次。

    Why does a browser send two requests for the same page when it's refreshed?

    【讨论】:

    • 嗨,沃迪。我已经确定它与browser refresh 无关。如果它是browser refresh,那么我可以看到所有logssource php 处打印两次,我将这个卷曲称为目的地。但是我可以看到在目的地打印了相同的请求,这是随机行为。
    • 嘿,为了完整起见,把log也放在代码的开头。我遇到了与您遇到的类似问题,这是由 Safari 引起的,并且 php 脚本被提前终止。因此,如果您通过 curl 发送随机数。您的目的地将收到 1 个随机数下的 2 个请求,对吧?
    • 嗨,我可以给你日志,但我可以看到日志只打印一次。在日志中,我正在打印 postdata、url 和 curl 输出以及 http 代码。是的,目的地正在接收 1 个随机数下的 2 个请求。这种行为是随机的。
    【解决方案3】:

    我们遇到了同样的问题,我们通过禁用或卸载 Firebug Lite 扩展解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2015-07-30
      • 2013-02-15
      • 1970-01-01
      • 2013-02-24
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多