为了账号安全,请及时绑定邮箱和手机立即绑定

始终执行CURLOPT_STDERR?

始终执行CURLOPT_STDERR?

PHP
杨魅力 2022-09-30 16:11:07
好吧,我在向不和谐API发出请求时遇到问题,我不明白curl是如何工作的。这是我的代码:function make_request($mixed, $token, $get_json = true) {    $url = is_string($mixed) ? $mixed : getApiUrl($mixed);    // TODO: Check for valid url!    $log_file = __DIR__.'/../logs/request.txt';    if(!is_readable($log_file)) printError("File '$log_file' is not readable!");    if(!is_writable($log_file)) printError("File '$log_file' is not writable!");    $ch = curl_init();    $f = fopen($log_file, 'w+');    if($f === false) printError("There was an error opening '$log_file'!");    ftruncate($f, 0);    curl_setopt_array($ch, array(        CURLOPT_URL            => $url,         CURLOPT_HTTPHEADER     => array('Authorization: Bot ' . $token),         CURLOPT_RETURNTRANSFER => 1,        CURLOPT_FOLLOWLOCATION => 1,        CURLOPT_VERBOSE        => 1,        CURLOPT_SSL_VERIFYPEER => 0,        CURLOPT_STDERR         => $f,    ));    $response = curl_exec($ch);    fclose($f);    curl_close($ch);    $contents = file_get_contents($log_file);    if($contents != '')     {        // Censor bot key!        $contents = preg_replace("/^Authorization: Bot.+?$/", "Authorization: Bot xxx", $contents);        printError($contents);    }    if($get_json) {        $pretty = isset($_GET["pretty"]);        if($pretty) {            $json = json_decode($response);            return json_encode($json, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);        }        return $response;    }    return json_decode($response, true);}我的问题是,当 curl 只显示冗长的日志时,也许我正在打印错误,但我不确定是用于打印错误还是整个日志。CURLOPT_STDERR在文档上:https://www.php.net/manual/en/function.curl-setopt.php将错误输出到的替代位置,而不是 STDERR。也许是因为启用了。CURLOPT_VERBOSETRUE 表示输出详细信息。将输出写入 STDERR 或使用 CURLOPT_STDERR指定的文件。在这种情况下,我需要知道何时发生错误。这里有任何提示吗?
查看完整描述

1 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

您走在正确的轨道上。如果需要诊断输出,则必须在发出请求之前安排捕获它。通常的方法是将其存储在RAM中,检查卷曲错误并进行适当的处理。


该代码如下所示:


$ch = curl_init();

curl_setopt_array($ch, [

    // ... other options here

    CURLOPT_RETURNTRANSFER => 1,

    CURLOPT_VERBOSE => 1,

    CURLOPT_STDERR => ($log = fopen('php://temp', 'w')),

]);

$response = curl_exec($ch);

if (false === $response) {

    $errno = curl_error($ch);

    $errmsg = curl_strerror($errno);

    $logtext = stream_get_contents($log, -1, 0);

    // ... log the info above, take action, etc.

} else {

    // ... $response is your HTTP response

}

curl_close($ch);


查看完整回答
反对 回复 2022-09-30
  • 1 回答
  • 0 关注
  • 69 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信