PHP curl_getinfo函数

定义和用法

curl_getinfo() 函数用于获取最后一次cURL会话连接的详细信息。这些信息对于调试、监控和优化HTTP请求非常有用。

提示: 此函数应该在调用curl_exec()之后使用,以获取关于传输的详细信息。

语法

mixed curl_getinfo ( resource $ch [, int $opt = 0 ] )

参数

参数 描述 类型 必需
ch curl_init() 返回的cURL句柄 resource
opt 要获取的特定信息选项。如果省略,返回所有可用信息的数组 int

返回值

如果指定了 opt 参数,返回其对应的值。如果未指定 opt,返回包含所有连接信息的关联数组。失败时返回 FALSE

常用信息选项

选项常量 描述 返回值类型 示例值
CURLINFO_HTTP_CODE 最后一次收到的HTTP状态码 int 200, 404, 500
CURLINFO_TOTAL_TIME 最后一次传输总耗时(秒) float 1.234
CURLINFO_CONNECT_TIME 建立连接所花费的时间(秒) float 0.123
CURLINFO_NAMELOOKUP_TIME 名称解析所花费的时间(秒) float 0.045
CURLINFO_SIZE_DOWNLOAD 下载数据的总字节数 float 10240
CURLINFO_SIZE_UPLOAD 上传数据的总字节数 float 512
CURLINFO_SPEED_DOWNLOAD 平均下载速度(字节/秒) float 2048
CURLINFO_SPEED_UPLOAD 平均上传速度(字节/秒) float 1024
CURLINFO_REDIRECT_COUNT 重定向次数 int 2
CURLINFO_REDIRECT_TIME 所有重定向步骤花费的总时间(秒) float 0.456
CURLINFO_CONTENT_TYPE 从Content-Type头获取的内容类型 string "text/html"
CURLINFO_EFFECTIVE_URL 最后一次有效的URL地址 string "https://example.com"

示例

示例 1:获取所有连接信息

@php
// 初始化cURL会话
$ch = curl_init();

curl_setopt_array($ch, [
    CURLOPT_URL => "https://api.example.com/data",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_TIMEOUT => 30
]);

// 执行请求
$response = curl_exec($ch);

if ($response !== false) {
    // 获取所有连接信息
    $info = curl_getinfo($ch);

    echo "请求详细信息:\n";
    echo "HTTP状态码: " . $info['http_code'] . "\n";
    echo "总耗时: " . round($info['total_time'], 3) . " 秒\n";
    echo "连接时间: " . round($info['connect_time'], 3) . " 秒\n";
    echo "下载大小: " . $info['size_download'] . " 字节\n";
    echo "下载速度: " . round($info['speed_download'] / 1024, 2) . " KB/秒\n";
    echo "重定向次数: " . $info['redirect_count'] . "\n";
    echo "最终URL: " . $info['url'] . "\n";
    echo "内容类型: " . $info['content_type'] . "\n";
} else {
    echo "请求失败: " . curl_error($ch);
}

curl_close($ch);
@endphp

示例 2:获取特定信息

@php
$ch = curl_init("https://jsonplaceholder.typicode.com/posts/1");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);

if ($response !== false) {
    // 获取特定的信息
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $totalTime = curl_getinfo($ch, CURLINFO_TOTAL_TIME);
    $downloadSize = curl_getinfo($ch, CURLINFO_SIZE_DOWNLOAD);
    $effectiveUrl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

    echo "请求摘要:\n";
    echo "状态码: {$httpCode}\n";
    echo "响应时间: " . round($totalTime * 1000, 2) . " 毫秒\n";
    echo "数据大小: " . $downloadSize . " 字节\n";
    echo "请求地址: {$effectiveUrl}\n";

    // 性能分析
    if ($totalTime > 1.0) {
        echo "警告: 请求时间较长,建议优化\n";
    }

    if ($httpCode >= 400) {
        echo "错误: HTTP状态码异常\n";
    }
} else {
    echo "请求失败: " . curl_error($ch);
}

curl_close($ch);
@endphp

示例 3:性能监控函数

@php
function makeRequestWithMonitoring($url, $options = []) {
    $ch = curl_init();

    $defaultOptions = [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_TIMEOUT => 30
    ];

    $finalOptions = $options + $defaultOptions;
    curl_setopt_array($ch, $finalOptions);

    $startTime = microtime(true);
    $response = curl_exec($ch);
    $endTime = microtime(true);

    $info = curl_getinfo($ch);
    $error = curl_error($ch);

    // 计算额外指标
    $phpExecutionTime = round(($endTime - $startTime) * 1000, 2);
    $curlTotalTime = round($info['total_time'] * 1000, 2);
    $overhead = $phpExecutionTime - $curlTotalTime;

    $monitoringData = [
        'success' => ($response !== false),
        'response' => $response,
        'info' => $info,
        'error' => $error,
        'performance' => [
            'php_execution_time_ms' => $phpExecutionTime,
            'curl_total_time_ms' => $curlTotalTime,
            'overhead_ms' => $overhead,
            'download_speed_kbps' => round($info['speed_download'] / 1024, 2)
        ]
    ];

    curl_close($ch);
    return $monitoringData;
}

// 使用监控函数
$result = makeRequestWithMonitoring("https://api.github.com/users/octocat");

if ($result['success']) {
    echo "请求成功!\n";
    echo "HTTP状态码: " . $result['info']['http_code'] . "\n";
    echo "cURL执行时间: " . $result['performance']['curl_total_time_ms'] . " 毫秒\n";
    echo "PHP总执行时间: " . $result['performance']['php_execution_time_ms'] . " 毫秒\n";
    echo "下载速度: " . $result['performance']['download_speed_kbps'] . " KB/秒\n";

    // 显示响应数据的前100个字符
    $preview = substr($result['response'], 0, 100);
    echo "响应预览: " . $preview . "...\n";
} else {
    echo "请求失败: " . $result['error'];
}
@endphp

示例 4:批量请求性能分析

@php
$urls = [
    "https://httpbin.org/delay/1",
    "https://httpbin.org/delay/2",
    "https://httpbin.org/delay/3"
];

$results = [];

foreach ($urls as $index => $url) {
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 10
    ]);

    $response = curl_exec($ch);
    $info = curl_getinfo($ch);

    $results[$index] = [
        'url' => $url,
        'success' => ($response !== false),
        'http_code' => $info['http_code'],
        'total_time' => $info['total_time'],
        'connect_time' => $info['connect_time'],
        'size_download' => $info['size_download']
    ];

    curl_close($ch);
}

// 分析结果
echo "批量请求性能分析:\n";
echo str_repeat("-", 50) . "\n";

$totalTime = 0;
foreach ($results as $index => $result) {
    echo "请求 #" . ($index + 1) . ":\n";
    echo "  URL: " . $result['url'] . "\n";
    echo "  状态: " . ($result['success'] ? '成功' : '失败') . "\n";
    echo "  HTTP状态码: " . $result['http_code'] . "\n";
    echo "  总时间: " . round($result['total_time'], 3) . " 秒\n";
    echo "  连接时间: " . round($result['connect_time'], 3) . " 秒\n";
    echo "  数据大小: " . $result['size_download'] . " 字节\n";
    echo "\n";

    $totalTime += $result['total_time'];
}

echo "总计:\n";
echo "  请求数量: " . count($results) . "\n";
echo "  总耗时: " . round($totalTime, 3) . " 秒\n";
echo "  平均耗时: " . round($totalTime / count($results), 3) . " 秒/请求\n";
@endphp

应用场景

调试分析

获取详细的请求信息,帮助定位问题

性能监控

监控请求耗时、速度等性能指标

统计分析

收集API调用统计数据进行优化

注意事项

重要:
  • curl_getinfo()必须在curl_exec()之后调用才能获取有效信息
  • 某些信息可能在某些传输类型下不可用
  • 时间相关的信息单位为秒,注意单位转换
  • 对于重定向请求,某些信息反映的是最终请求的数据
  • 在生产环境中,注意不要泄露敏感的诊断信息