curl_getinfo() 函数用于获取最后一次cURL会话连接的详细信息。这些信息对于调试、监控和优化HTTP请求非常有用。
mixed curl_getinfo ( resource $ch [, int $opt = 0 ] )
| 参数 | 描述 | 类型 | 必需 |
|---|---|---|---|
| ch | 由 curl_init() 返回的cURL句柄 |
resource | 是 |
| opt | 要获取的特定信息选项。如果省略,返回所有可用信息的数组 | int | 否 |
如果指定了 opt 参数,返回其对应的值。如果未指定 opt,返回包含所有连接信息的关联数组。失败时返回 FALSE。
@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
@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
@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
@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调用统计数据进行优化