PHP curl_version函数

定义和用法

curl_version() 函数用于获取当前cURL版本的详细信息,包括版本号、支持的协议、SSL功能、特性等。这个函数在检测系统环境、功能验证和调试时非常有用。

注意:此函数返回一个包含cURL版本信息的数组,需要PHP编译时启用了cURL扩展。

语法

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代理

示例

示例 1:基本用法

// 获取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";

示例 2:检查支持的特性

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();

示例 3:环境检测和兼容性检查

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();

示例 4:根据版本选择功能实现

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";
}

示例 5:调试和日志记录

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);
}

版本号解析

如何解析24位版本号:

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
使用场景:
  • 检测系统环境是否满足应用需求
  • 根据cURL版本动态启用或禁用某些功能
  • 调试和故障排除时获取环境信息
  • 生成系统诊断报告
  • 编写跨版本兼容的代码
最佳实践:
  • 在应用程序启动时检查cURL环境
  • 根据检测到的特性选择合适的实现方式
  • 记录环境信息以便问题排查
  • 为用户提供清晰的环境要求说明

常见问题

Q: 如何检查cURL扩展是否已安装?

A: 可以使用 extension_loaded('curl') 或调用 curl_version() 并检查返回值是否为 false

Q: 如何检查是否支持HTTPS?

A: 检查 curl_version()['features'] 是否包含 CURL_VERSION_SSL 位,以及 protocols 数组中是否包含 'https'。

Q: 如何确定cURL版本是否满足最低要求?

A: 使用 version_compare() 函数比较版本字符串:
version_compare(curl_version()['version'], '7.36.0', '>=')

相关函数