curl_version() 函数用于获取当前cURL版本的详细信息,包括版本号、支持的协议、SSL功能、特性等。这个函数在检测系统环境、功能验证和调试时非常有用。
curl_version ([ int $age = CURLVERSION_NOW ] ) : array|false
| 参数 | 描述 |
|---|---|
| age | 可选。指定要获取的cURL版本信息的版本。通常使用 CURLVERSION_NOW 常量获取当前版本信息。 |
返回包含cURL版本信息的数组,失败时返回 false。
| 键名 | 描述 |
|---|---|
| version_number | cURL库的24位版本号 |
| version | cURL版本字符串(如 "7.64.0") |
| host | 构建cURL的主机信息 |
| features | 一个位掩码,表示支持的cURL特性 |
| ssl_version | SSL版本字符串 |
| ssl_version_number | SSL版本号 |
| libz_version | libz版本字符串 |
| protocols | 支持的协议数组 |
| 常量 | 值 | 描述 |
|---|---|---|
CURL_VERSION_IPV6 |
1 | 支持IPv6 |
CURL_VERSION_KERBEROS4 |
2 | 支持Kerberos V4 |
CURL_VERSION_SSL |
4 | 支持SSL |
CURL_VERSION_LIBZ |
8 | 支持libz压缩 |
CURL_VERSION_NTLM |
16 | 支持NTLM认证 |
CURL_VERSION_GSSNEGOTIATE |
32 | 支持GSS-Negotiate |
CURL_VERSION_DEBUG |
64 | 支持调试 |
CURL_VERSION_ASYNCHDNS |
128 | 支持异步DNS解析 |
CURL_VERSION_SPNEGO |
256 | 支持SPNEGO认证 |
CURL_VERSION_LARGEFILE |
512 | 支持大文件 |
CURL_VERSION_IDN |
1024 | 支持国际化域名 |
CURL_VERSION_SSPI |
2048 | 支持SSPI(Windows) |
CURL_VERSION_CONV |
4096 | 支持字符集转换 |
CURL_VERSION_CURLDEBUG |
8192 | 支持cURL调试 |
CURL_VERSION_TLSAUTH_SRP |
16384 | 支持TLS-SRP认证 |
CURL_VERSION_NTLM_WB |
32768 | 支持NTLM代理 |
// 获取cURL版本信息
$versionInfo = curl_version();
if ($versionInfo === false) {
echo "无法获取cURL版本信息,cURL扩展可能未安装。\n";
exit(1);
}
echo "cURL版本信息:\n";
echo "==============\n";
// 显示基本信息
echo "cURL版本: {$versionInfo['version']}\n";
echo "主机信息: {$versionInfo['host']}\n";
echo "SSL版本: {$versionInfo['ssl_version']}\n";
echo "libz版本: {$versionInfo['libz_version']}\n";
// 显示版本号(24位)
$versionNumber = $versionInfo['version_number'];
echo "版本号(24位): {$versionNumber}\n";
// 解析24位版本号
$major = ($versionNumber >> 16) & 0xFF;
$minor = ($versionNumber >> 8) & 0xFF;
$patch = $versionNumber & 0xFF;
echo "解析版本号: {$major}.{$minor}.{$patch}\n";
// 显示支持的协议
echo "支持的协议: " . implode(', ', $versionInfo['protocols']) . "\n";
function checkCurlFeatures() {
$versionInfo = curl_version();
$features = $versionInfo['features'];
$featureList = [
CURL_VERSION_IPV6 => 'IPv6支持',
CURL_VERSION_SSL => 'SSL支持',
CURL_VERSION_LIBZ => '压缩支持',
CURL_VERSION_NTLM => 'NTLM认证',
CURL_VERSION_GSSNEGOTIATE => 'GSS-Negotiate',
CURL_VERSION_DEBUG => '调试支持',
CURL_VERSION_ASYNCHDNS => '异步DNS',
CURL_VERSION_SPNEGO => 'SPNEGO',
CURL_VERSION_LARGEFILE => '大文件支持',
CURL_VERSION_IDN => '国际化域名',
CURL_VERSION_SSPI => 'SSPI支持',
CURL_VERSION_CONV => '字符集转换',
CURL_VERSION_CURLDEBUG => 'cURL调试',
CURL_VERSION_TLSAUTH_SRP => 'TLS-SRP',
CURL_VERSION_NTLM_WB => 'NTLM代理'
];
echo "cURL特性检测:\n";
echo "==============\n";
echo "特性位掩码值: {$features}\n\n";
foreach ($featureList as $mask => $description) {
$supported = ($features & $mask) ? '✓' : '✗';
echo "[{$supported}] {$description} (掩码: {$mask})\n";
}
return $features;
}
// 使用示例
$features = checkCurlFeatures();
class CurlEnvironment {
public static function checkRequirements() {
$versionInfo = curl_version();
if ($versionInfo === false) {
return [
'curl_available' => false,
'message' => 'cURL扩展未安装或未启用'
];
}
$requirements = [
'curl_available' => true,
'version' => $versionInfo['version'],
'version_number' => $versionInfo['version_number'],
'ssl_support' => (bool)($versionInfo['features'] & CURL_VERSION_SSL),
'ssl_version' => $versionInfo['ssl_version'],
'ipv6_support' => (bool)($versionInfo['features'] & CURL_VERSION_IPV6),
'http2_support' => self::checkHttp2Support(),
'protocols' => $versionInfo['protocols'],
'meets_requirements' => true,
'warnings' => [],
'errors' => []
];
// 检查最低版本要求
if (version_compare($versionInfo['version'], '7.36.0', '<')) {
$requirements['warnings'][] = "cURL版本 {$versionInfo['version']} 较旧,建议升级到7.36.0或更高版本";
}
// 检查SSL支持
if (!$requirements['ssl_support']) {
$requirements['errors'][] = 'cURL不支持SSL,无法进行HTTPS请求';
$requirements['meets_requirements'] = false;
}
// 检查HTTPS协议支持
if (!in_array('https', $versionInfo['protocols'])) {
$requirements['errors'][] = '不支持HTTPS协议';
$requirements['meets_requirements'] = false;
}
// 检查HTTP/2支持
if (!$requirements['http2_support']) {
$requirements['warnings'][] = '不支持HTTP/2,可能影响性能';
}
return $requirements;
}
private static function checkHttp2Support() {
// 检查cURL版本是否支持HTTP/2 (需要7.33.0+)
$versionInfo = curl_version();
$version = $versionInfo['version'];
// 方法1:通过版本号判断
$hasHttp2ByVersion = version_compare($version, '7.33.0', '>=');
// 方法2:尝试初始化一个支持HTTP/2的请求
$hasHttp2ByTest = false;
$ch = curl_init();
if ($ch) {
curl_setopt($ch, CURLOPT_URL, 'https://httpbin.org/headers');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
// 不实际执行请求,只检查选项设置
$hasHttp2ByTest = (curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0) !== false);
curl_close($ch);
}
return $hasHttp2ByVersion || $hasHttp2ByTest;
}
public static function generateReport() {
$requirements = self::checkRequirements();
$report = "cURL环境检测报告\n";
$report .= "================\n";
$report .= "检测时间: " . date('Y-m-d H:i:s') . "\n\n";
if (!$requirements['curl_available']) {
$report .= "❌ {$requirements['message']}\n";
return $report;
}
$report .= "✓ cURL版本: {$requirements['version']}\n";
$report .= "✓ SSL支持: " . ($requirements['ssl_support'] ? '是' : '否') . "\n";
if ($requirements['ssl_support']) {
$report .= "✓ SSL版本: {$requirements['ssl_version']}\n";
}
$report .= "✓ IPv6支持: " . ($requirements['ipv6_support'] ? '是' : '否') . "\n";
$report .= "✓ HTTP/2支持: " . ($requirements['http2_support'] ? '是' : '否') . "\n";
$report .= "✓ 支持的协议: " . implode(', ', $requirements['protocols']) . "\n\n";
if (!empty($requirements['warnings'])) {
$report .= "警告:\n";
foreach ($requirements['warnings'] as $warning) {
$report .= "⚠️ {$warning}\n";
}
$report .= "\n";
}
if (!empty($requirements['errors'])) {
$report .= "错误:\n";
foreach ($requirements['errors'] as $error) {
$report .= "❌ {$error}\n";
}
$report .= "\n";
}
$report .= "环境要求满足: " . ($requirements['meets_requirements'] ? '✅ 是' : '❌ 否') . "\n";
return $report;
}
}
// 使用示例
echo CurlEnvironment::generateReport();
class CurlFeatureSelector {
private static $versionInfo = null;
private static function init() {
if (self::$versionInfo === null) {
self::$versionInfo = curl_version();
}
}
public static function supportsFeature($feature) {
self::init();
return (self::$versionInfo['features'] & $feature) !== 0;
}
public static function getOptimalHttpVersion() {
self::init();
// 检查HTTP/2支持
if (version_compare(self::$versionInfo['version'], '7.33.0', '>=')) {
return CURL_HTTP_VERSION_2_0;
}
// 检查HTTP/1.1支持
if (version_compare(self::$versionInfo['version'], '7.10.0', '>=')) {
return CURL_HTTP_VERSION_1_1;
}
return CURL_HTTP_VERSION_1_0;
}
public static function shouldUseAsyncDns() {
self::init();
return self::supportsFeature(CURL_VERSION_ASYNCHDNS);
}
public static function getRecommendedOptions() {
self::init();
$options = [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_CONNECTTIMEOUT => 10
];
// 根据特性添加优化选项
if (self::supportsFeature(CURL_VERSION_IPV6)) {
$options[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_WHATEVER;
}
if (self::shouldUseAsyncDns()) {
// 异步DNS可以减少连接时间
}
// 根据SSL版本设置SSL选项
if (self::supportsFeature(CURL_VERSION_SSL)) {
$options[CURLOPT_SSL_VERIFYPEER] = true;
$options[CURLOPT_SSL_VERIFYHOST] = 2;
// 如果版本足够新,启用SSL会话缓存
if (version_compare(self::$versionInfo['version'], '7.16.0', '>=')) {
$options[CURLOPT_SSL_SESSIONID_CACHE] = true;
}
}
return $options;
}
public static function canUseProtocol($protocol) {
self::init();
return in_array($protocol, self::$versionInfo['protocols']);
}
public static function getCapabilityReport() {
self::init();
$capabilities = [
'version' => self::$versionInfo['version'],
'protocols' => self::$versionInfo['protocols'],
'features' => [
'ssl' => self::supportsFeature(CURL_VERSION_SSL),
'ipv6' => self::supportsFeature(CURL_VERSION_IPV6),
'http2' => version_compare(self::$versionInfo['version'], '7.33.0', '>='),
'compression' => self::supportsFeature(CURL_VERSION_LIBZ),
'async_dns' => self::shouldUseAsyncDns(),
'ntlm_auth' => self::supportsFeature(CURL_VERSION_NTLM),
'gss_auth' => self::supportsFeature(CURL_VERSION_GSSNEGOTIATE),
'spnego_auth' => self::supportsFeature(CURL_VERSION_SPNEGO)
],
'recommended_http_version' => self::getOptimalHttpVersion(),
'ssl_version' => self::$versionInfo['ssl_version']
];
return $capabilities;
}
}
// 使用示例
$selector = new CurlFeatureSelector();
$capabilities = CurlFeatureSelector::getCapabilityReport();
echo "cURL能力报告:\n";
echo "==============\n";
echo "版本: {$capabilities['version']}\n";
echo "SSL版本: {$capabilities['ssl_version']}\n";
echo "推荐HTTP版本: " . ($capabilities['recommended_http_version'] == CURL_HTTP_VERSION_2_0 ? 'HTTP/2' : 'HTTP/1.1') . "\n\n";
echo "支持的特性:\n";
foreach ($capabilities['features'] as $feature => $supported) {
echo " {$feature}: " . ($supported ? '✓' : '✗') . "\n";
}
echo "\n支持的协议:\n";
foreach ($capabilities['protocols'] as $protocol) {
echo " {$protocol}\n";
}
class CurlDebugLogger {
public static function logEnvironment($logFile = null) {
$versionInfo = curl_version();
$logData = [
'timestamp' => date('Y-m-d H:i:s'),
'curl_version' => $versionInfo['version'],
'curl_version_number' => $versionInfo['version_number'],
'host' => $versionInfo['host'],
'ssl_version' => $versionInfo['ssl_version'],
'libz_version' => $versionInfo['libz_version'],
'features' => $versionInfo['features'],
'features_list' => self::parseFeatures($versionInfo['features']),
'protocols' => $versionInfo['protocols'],
'php_version' => PHP_VERSION,
'php_os' => PHP_OS,
'server_software' => $_SERVER['SERVER_SOFTWARE'] ?? 'CLI'
];
$jsonData = json_encode($logData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
if ($logFile) {
file_put_contents($logFile, $jsonData . PHP_EOL, FILE_APPEND | LOCK_EX);
}
return $jsonData;
}
private static function parseFeatures($features) {
$featureMap = [
CURL_VERSION_IPV6 => 'IPv6',
CURL_VERSION_SSL => 'SSL',
CURL_VERSION_LIBZ => '压缩',
CURL_VERSION_NTLM => 'NTLM',
CURL_VERSION_GSSNEGOTIATE => 'GSS-Negotiate',
CURL_VERSION_DEBUG => '调试',
CURL_VERSION_ASYNCHDNS => '异步DNS',
CURL_VERSION_SPNEGO => 'SPNEGO',
CURL_VERSION_LARGEFILE => '大文件',
CURL_VERSION_IDN => '国际化域名',
CURL_VERSION_SSPI => 'SSPI',
CURL_VERSION_CONV => '字符集转换',
CURL_VERSION_CURLDEBUG => 'cURL调试',
CURL_VERSION_TLSAUTH_SRP => 'TLS-SRP',
CURL_VERSION_NTLM_WB => 'NTLM代理'
];
$enabledFeatures = [];
foreach ($featureMap as $mask => $name) {
if ($features & $mask) {
$enabledFeatures[] = $name;
}
}
return $enabledFeatures;
}
public static function compareEnvironments($env1, $env2) {
$diff = [];
$keys = ['curl_version', 'ssl_version', 'features', 'protocols'];
foreach ($keys as $key) {
if ($env1[$key] != $env2[$key]) {
$diff[$key] = [
'from' => $env1[$key],
'to' => $env2[$key]
];
}
}
return $diff;
}
}
// 使用示例
echo "当前cURL环境信息:\n";
echo json_decode(CurlDebugLogger::logEnvironment(), true)['curl_version'] . "\n\n";
// 记录到文件
$logFile = __DIR__ . '/curl_env.log';
CurlDebugLogger::logEnvironment($logFile);
echo "环境信息已记录到: {$logFile}\n";
// 模拟环境变更对比
$env1 = [
'curl_version' => '7.64.0',
'ssl_version' => 'OpenSSL/1.1.1a',
'features' => 151231,
'protocols' => ['http', 'https', 'ftp']
];
$env2 = [
'curl_version' => '7.68.0',
'ssl_version' => 'OpenSSL/1.1.1d',
'features' => 152543,
'protocols' => ['http', 'https', 'ftp', 'sftp']
];
$diff = CurlDebugLogger::compareEnvironments($env1, $env2);
if (!empty($diff)) {
echo "\n环境变化检测:\n";
print_r($diff);
}
cURL使用24位版本号表示法,可以按以下方式解析:
$version_number = 462402; // 示例:7.64.2
$major = ($version_number >> 16) & 0xFF; // 7
$minor = ($version_number >> 8) & 0xFF; // 64
$patch = $version_number & 0xFF; // 2
curl_version() 函数需要PHP编译时启用了cURL扩展。如果未启用,函数将返回 false。
A: 可以使用 extension_loaded('curl') 或调用 curl_version() 并检查返回值是否为 false。
A: 检查 curl_version()['features'] 是否包含 CURL_VERSION_SSL 位,以及 protocols 数组中是否包含 'https'。
A: 使用 version_compare() 函数比较版本字符串:
version_compare(curl_version()['version'], '7.36.0', '>=')