Php 使cURL输出STDERR成为文件(或字符串)
我们正在调试服务器上的一些cURL错误,我想看看STDERR日志。目前,我们所能看到的错误是“错误代码:7”,我们无法连接到目标服务器。我们已经联系了主机并制定了特殊规则来打开我们需要的端口,我们甚至暂时忽略了证书 但是,我们无法连接。我需要调试这个,但是我看不到任何相关的信息 我认为,提到“VERBOSE”和“STDERR”的行是最重要的。未向$curl\u日志写入任何内容。我做错了什么?按照手册逻辑,这应该是正确的 正在使用的PHP:Php 使cURL输出STDERR成为文件(或字符串),php,curl,stderr,verbose,Php,Curl,Stderr,Verbose,我们正在调试服务器上的一些cURL错误,我想看看STDERR日志。目前,我们所能看到的错误是“错误代码:7”,我们无法连接到目标服务器。我们已经联系了主机并制定了特殊规则来打开我们需要的端口,我们甚至暂时忽略了证书 但是,我们无法连接。我需要调试这个,但是我看不到任何相关的信息 我认为,提到“VERBOSE”和“STDERR”的行是最重要的。未向$curl\u日志写入任何内容。我做错了什么?按照手册逻辑,这应该是正确的 正在使用的PHP: 从PHP手册: CURLOPT_VERBOSE为TR
从PHP手册:
CURLOPT_VERBOSE为TRUE可输出详细信息。将输出写入STDERR
CURLOPT_STDERR将错误输出到替代STDERR的替代位置
这也不是权限问题,我已经在服务器端将文件和脚本权限设置为777,我的本地客户端是windows,从来都不关心权限设置(无论如何,这只适用于开发人员)。来自函数curl\u setopt的php手册:
CURLOPT_FILE The file that the transfer should be written to. The default is STDOUT (the browser window).
你应该把
$output = fread($curl_log, 2048);
echo $output; // This returns nothing!
fclose($curl_log);
在
$response=curl\u exec($curl)之后代码>否则,文件将在curl执行期间关闭。您在示例中犯了几个错误:
1)在读取“详细日志”之前,必须调用curl\u exec()
,因为curl\u setopt()
不执行任何操作,因此在curl\u exec()之前无法记录任何内容
2)您正在打开$curl\u log=fopen(“curl.txt”,“w”)
仅用于写入,因此即使在写入文件并倒带内部文件指针之后,也无法读取任何内容
因此,正确的缩短代码应该如下所示:
<?php
$curl = curl_init();
$curl_log = fopen("curl.txt", 'rw'); // open file for READ and write
$url = "http://www.google.com";
curl_setopt_array($curl, array(
CURLOPT_URL => $url,
CURLOPT_VERBOSE => 1,
CURLOPT_STDERR => $curl_log,
CURLOPT_RETURNTRANSFER => 1
));
$response = curl_exec($curl);
rewind($curl_log);
$output= fread($curl_log, 2048);
echo "<pre>". print_r($output, 1). "</pre>";
fclose($curl_log);
// ...
?>
注意:详细日志可能超过2048字节,因此您可以在curl\u exec()之后“fclose”$curl\u日志,然后使用例如file\u get\u contents()读取整个文件。
在这种情况下,不应将点2)视为错误:-)将上述所有答案放在一起,我使用此函数通过loggin to a file选项发出Curl Post请求:
$filename = 'curl.txt';
$curl_log = fopen($filename, 'w'); // open file for write (rw, a, etc didn't help)
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_STDERR, $curl_log);
$result = curl_exec($ch);
fclose($curl_log);
$curl_log = fopen($filename, 'r'); // open file for read
$output= fread($curl_log, filesize($filename));
echo $output;
希望这对其他人有所帮助。派对有点晚了,但是这个页面仍然在谷歌中弹出,所以我们走吧
如果CURLINFO\u HEADER\u OUT也设置为TRUE,则CURLOPT\u VERBOSE似乎不会记录任何内容
这是PHP()中的一个已知错误,由于某些原因,他们决定不修复它。我需要关闭文件才能读取它,这对我来说很有效:
(PHP5.6.0,Apache/2.2.15)CURLOPT_详细声明要写入STDERR,CURLOPT_文件何时输出数据?CURLOPT_FILE=>$curl_log…仍不写入文件。脚本是否完成?我这样问是因为缺少一个curl\u exec()
。你期望的输出是什么(为什么)?哦,是的,我在我的复制/粘贴中取出了。把curl_exec放回去。我希望得到一些调试信息,尽管我真的不知道从中可以得到什么。我不知道是什么原因导致服务器端的连接失败。您可以发现这对我来说很有效,以找到实际问题所在应该是$defaults[CURLINFO\u HEADER\u OUT]=1启用CURLINFO\u HEADER\u OUT时,不会写入代码>详细信息
function CURLPostRequest($url, array $post = NULL, array $options = array(), $log_file = NULL){
$defaults = array(
CURLOPT_POST => 1,
CURLOPT_HEADER => 0,
CURLOPT_URL => $url,
CURLOPT_FRESH_CONNECT => 1,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FORBID_REUSE => 1,
CURLOPT_TIMEOUT => 4,
CURLOPT_POSTFIELDS => http_build_query($post)
);
if (is_resource($log_file)){
$defaults[CURLOPT_VERBOSE]=1;
$defaults[CURLOPT_STDERR]=$log_file;
$defaults[CURLINFO_HEADER_OUT]=1;
}
$ch = curl_init();
curl_setopt_array($ch, ($options + $defaults));
if( ! $result = curl_exec($ch)){
throw new Exception(curl_error($ch));
}
if (is_resource($log_file)){
$info = curl_getinfo($ch);
if (isset($info['request_header'])){
fwrite($log_file, PHP_EOL.PHP_EOL.'* POST Content'.PHP_EOL.PHP_EOL);
fwrite($log_file, print_r($info['request_header'],true));
fwrite($log_file, http_build_query($post));
}
fwrite($log_file, PHP_EOL.PHP_EOL.'* Response Content'.PHP_EOL.PHP_EOL);
fwrite($log_file, $result.PHP_EOL.PHP_EOL);
}
curl_close($ch);
return $result;
}
$filename = 'curl.txt';
$curl_log = fopen($filename, 'w'); // open file for write (rw, a, etc didn't help)
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_STDERR, $curl_log);
$result = curl_exec($ch);
fclose($curl_log);
$curl_log = fopen($filename, 'r'); // open file for read
$output= fread($curl_log, filesize($filename));
echo $output;