无法使用curlopt_stderr和curlopt_file使用PHP cURL写入文件

时间:2012-06-22 18:06:11

标签: php logging curl

我正在尝试将来自cURL命中的信​​息记录到日志文件中,但我无法这样做, 我运行带有wamp的窗口并完全控制机器中的所有用户,调用cURL的日志和php文件位于此测试的同一目录中。我使用了以下代码:

$session = curl_init();
$logfh = fopen("my_log.log", 'a+');
if ($logfh) {
  print "Opened the log file without errors";
}
curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
// Optional settings for debugging
curl_setopt($session, CURLOPT_VERBOSE, true);
curl_setopt($session, CURLOPT_FILE, $logfh); // logs curl messages
// curl_setopt($session, CURLOPT_STDERR, $logfh); // logs curl messages
curl_exec($session);
curl_close($session);

日志文件打开时没有错误,我的cURL返回成功,但没有记录到文件中。我曾经使用过CURLOPT_FILECURLOPT_STDERR但是既没有帮助原因也不确定我是否有所收获这里错了。任何有关调试的建议都将受到赞赏。

3 个答案:

答案 0 :(得分:5)

注意:如果您尝试卷曲的URL重定向到另一个URL,则将输出写入文件将失败。

请确保您还添加以下行 -

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);

另外,请注意,请确保使用fclose()关闭文件,以确保文件已完整。

答案 1 :(得分:4)

如果您添加了fclose(),并在上面的评论中列出了各种“小修正”,但它仍然无效...那么我怀疑您看到了相互矛盾的选项:

  • CURLOPT_RETURNTRANSFER告诉curl将响应作为curl_exec()来电的返回值返回。

  • CURLOPT_FILECURLOPT_STDERR告诉curl将响应(或错误输出)写入指定的文件句柄。

似乎这些可能是相互排斥的。我建议您使用其中一种,但不能同时使用两者:

使用CURLOPT_RETURNTRANSFER,如下所示:

$session = curl_init();
$logfh = fopen("my_log.log", 'a+');
if ($logfh !== false) {
  print "Opened the log file without errors";
}
curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
curl_setopt($session, CURLOPT_VERBOSE, true);
$result = curl_exec($session);
curl_close($session);
fwrite($logfh, $result);
fclose($logfh);

使用CURLOPT_FILE,如下所示:

$session = curl_init();
$logfh = fopen("my_log.log", 'a+');
if ($logfh !== false) {
  print "Opened the log file without errors";
}
curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_FILE, $logfh);
curl_setopt($session, CURLOPT_VERBOSE, true);
curl_exec($session);
curl_close($session);
fclose($logfh);

答案 2 :(得分:0)

使用CURLINFO_HEADER_OUT = true时也可能存在问题。我想CURLINFO_VERBOSE中有一些东西使用这个选项并且只是压制VERBOSE信息......

curl_setopt($ch, CURLINFO_HEADER_OUT, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, fopen('log.log', 'a+'));

提一下,你可以使用:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, fopen('log.log', 'a+'));

如果要将输出记录到文件中,仍然可以返回curl_exec