【问题标题】:php cURL script run twice when printing return stringphp cURL脚本在打印返回字符串时运行两次
【发布时间】:2012-02-07 23:04:03
【问题描述】:

我有以下脚本。在远程 php 脚本中,一条记录被添加到数据库表中。 当我在这个脚本中留下最后一行(打印 $html;)时,添加了 2 条记录!

当我省略该行时,只会添加一条记录。但是显然我没有任何输出。

如果我将输出写入文件,则只会添加一条记录。输出是一个 html 页面。

<?php
  $ch = curl_init();

  // set URL and other appropriate options
  curl_setopt($ch, CURLOPT_URL, 'http://somedomain.nl/some.php?PARAMS=blabla');
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
  curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

  // cookie settings
  curl_setopt($ch, CURLOPT_COOKIEJAR, 'some.txt');
  curl_setopt($ch, CURLOPT_COOKIEFILE, 'some.txt');

  // set data to be posted
  curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST);

  // perform the request
  $html = curl_exec($ch);

  // close the connection
  curl_close($ch);

  print $html;
?>

有什么建议吗?

克。韩

/** 更新

<select class="p_ssyskey_mke" name=P_SSYSKEY_MKE onchange="MerkSubmitP()">
  <option value="">selecteer een merk</option>
  <option value="A0001E2Q">Subaru</option>
  <option selected value="A0001E2S">Toyota</option>
  <option value="A0001E2T">Volkswagen</option>
</select> 

这是一个$html的sn-p,整个页面比较大。 打印 html 的子字符串表明脚本将在 '

@Poonam:当我在 ob_clean_end() 之后再次打印 $html 时,会添加第二条记录。

现在我已经实现了一个非常粗略的解决方法。由于记录有时间戳,如果最后一条记录不是至少 1 秒,我会阻止添加第二条记录。我讨厌它,但现在它有效。

克。韩

/** 更新

这个问题不是来自 cURL,用 file_get_contents 尝试同样的事情会做同样的事情。

也许原因在于我正在使用的 mod_rewrite。

克。韩

/** 更新

很可能是 mod_rewrite。当使用直接 URL 而不是通过重写规则时,它的行为符合预期。

这些是我正在使用的重写规则:

RewriteEngine On
RewriteRule ^zoek/(.*)$ parts.php?PARAMS=$1 [L]

Parts.php 是上面贴的脚本。

克。韩

【问题讨论】:

  • 你能显示$html变量的内容吗?
  • 完全不知道,但是每当您将 curl_exec($ch) 存储在其打印数据的变量中,然后在第二次编写 print 时,为避免这种情况,您可以执行 ob_start(); curl_exec($ch); $html = ob_get_contents(); ob_end_clean();
  • @Poonam,把它写下来作为答案,因为我认为这将是他的解决方案。似乎 $html 正在获取对该函数的引用并重新运行它,但文档建议没有这种可能的行为。
  • @Poonam 当前代码中没有理由两次调用远程 URL,这可能是为什么将两条记录插入数据库的原因。添加输出缓冲不会解决问题,只会增加内存使用量。我怀疑上面的脚本被调用了两次,我怀疑我知道为什么,这就是我要求查看 HTML 的原因。
  • @HanTimmers 我真的可以看整个页面,如果你不把它放在这里,你可以把它贴在pastebin。除其他外,我要寻找的是带有空 src=&lt;script&gt; 标签、带有空 src=&lt;image&gt; 标签和带有空 href=&lt;link&gt; 标签。

标签: php curl


【解决方案1】:

将 CURLOPT_RETURNTRANSFER 设置为 false 并执行 curl_exec($ch) 而不是 $html = curl_exec($ch)。然后curl输出会直接返回给浏览器。

【讨论】:

  • 对于上面的代码,这不是一个坏主意,但它不会解决问题。
  • 这对我有用,谢谢!因此,我有一个 php 进程执行了两次。
  • 这个解决方案不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 2021-05-25
相关资源
最近更新 更多