猿问

始终执行CURLOPT_STDERR?

好吧,我在向不和谐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_VERBOSE

TRUE 表示输出详细信息。将输出写入 STDERR 或使用 CURLOPT_STDERR指定的文件。

在这种情况下,我需要知道何时发生错误。这里有任何提示吗?


杨魅力
浏览 70回答 1
1回答

茅侃侃

您走在正确的轨道上。如果需要诊断输出,则必须在发出请求之前安排捕获它。通常的方法是将其存储在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);
随时随地看视频慕课网APP
我要回答