直接看 phpinfo() 里有没有 cURL support 这一行
这是最可靠、最直观的判断方式。PHP 探针本质就是封装了 phpinfo() 或其子集,但很多轻量探针会过滤掉模块详情,导致你“看着有 curl 字样,实际没启用”。务必手动在浏览器中打开完整 phpinfo()页面(不是探针首页),然后按 Ctrl+F 搜索 cURL support —— 它必须出现在一个独立表格行中,且值为 enabled,才算真正支持。
- 如果只搜到
curl_version 函数存在,但没 cURL support: enabled,说明扩展加载失败或被禁用 - 如果搜不到任何 curl 相关区块,基本可断定扩展根本没加载
- 部分探针会显示 libcurl 版本号,但这只是编译时信息,不等于运行时可用
命令行 php -m 和 Web 页面结果可能不一致
PHP CLI(终端)和 Web SAPI(比如 Apache 或 PHP-FPM)往往用两套 php.ini 配置文件。你在终端执行 php -m | grep curl 看到 curl,不代表网页里能用;反过来也成立。这点特别容易被忽略,尤其在 Docker 或宝塔等环境中。
- 查 Web 环境用的配置:在
phpinfo() 页面里找 Loaded Configuration File 的路径 - 查 CLI 环境用的配置:终端执行 php --ini
- 两个 php.ini 都要检查是否有未注释的
extension=curl.so(Linux/macOS)或 extension=php_curl.dll(Windows)
用 function_exists('curl_init') 只是基础验证,不够准
这个函数存在,只能说明扩展“曾经被加载过”,但不能反映当前上下文是否真能用。比如某些环境启用了 disable_functions,把 curl_init 显式禁掉了,这时函数存在但调用会直接报错。
<?php$ch = curl_init('https://httpbin.org/get');curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);$result = curl_exec($ch);$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);curl_close($ch);if ($result !== false && $httpCode == 200) {echo'cURL 实际可用';} else {echo'cURL 加载了但无法完成请求:' . curl_error($ch);}
- 注意别用
file_get_contents() 或 get_headers() 替代测试,它们底层不一定走 curl
curl 版本太低也会导致功能不可用,比如 HTTP/3 或 TLS 1.3
PHP 显示支持 curl,不代表所有现代特性都可用。例如想用 CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_3,得确保 libcurl ≥ 7.66.0;想安全访问某些新站点,可能需要 curl ≥ 7.71.0 才默认支持 TLS 1.3。
- 查版本:在
phpinfo() 里找 cURL Information → Version,或代码中调用 curl_version() - PHP 8.2+ 提供了 curl_up_to_date('7.66.0') 这种语义化判断函数,比手动解析字符串更安全
- 旧系统(如 CentOS 7 默认 curl 7.29)即使开了扩展,也大概率不支持 HTTP/2 以上协议
实际排查时,先确认 cURL support: enabled 是否真实存在,再核对 CLI/Web 配置是否同步,最后用一次真实请求验证连通性——三个环节缺一不可。版本兼容性问题常被当作“curl 不工作”来处理,其实只是功能缺失,不是开关没开。