写个 PHP 脚本调第三方接口,本地测好好的,换到新服务器就报 Call to undefined function curl_init。代码一个字没改,问题不在逻辑,在环境没开这个扩展。
curl_init 是什么
它是 PHP 的 cURL 扩展提供的函数,用来初始化一个会话句柄。后续用 curl_setopt 设置 URL、头、超时、POST 数据,最后 curl_exec 发请求。整个流程是:init 拿句柄、setopt 配参数、exec 执行、close 释放。它比 file_get_contents 强在能设超时、发各种方法、灵活处理 Cookie 和重定向。
报未定义函数怎么修
php -m | grep curl
# 打开 php.ini,去掉 extension=curl 前面的分号
systemctl restart php-fpm先 php -m 看有没有 curl 模块。没有就编辑 php.ini,找到 extension=curl 那行,删掉行首的分号。Windows 上还要确认 extension_dir 路径对,以及 php_curl.dll 确实存在。改完重启 PHP 或 FPM 才生效。用 Docker 的话记得镜像里装 libcurl,别只装扩展。
一个完整的请求写法
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 接口地址);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$res = curl_exec($ch);
curl_close($ch);CURLOPT_RETURNTRANSFER 设 true 才会把响应作为返回值,否则直接打印到页面。生产环境务必设 CURLOPT_TIMEOUT,默认不超时,对方卡住你的脚本也一直挂着。
HTTPS 和报错的坑
- 证书校验失败:本地开发可临时关掉 VERIFYPEER,生产别关,应配好 CA 证书路径。
- 拿不到错误信息:exec 返回 false 时,用 curl_error 和 curl_errno 查具体原因,别只看 false。
- 响应乱码:对方返回压缩内容,加 CURLOPT_ENCODING 让 curl 自动解压。
判断提醒:能用 file_get_contents 简单抓个页面就别上 curl;一旦要设超时、带认证头或处理错误码,curl_init 这套才值得写。