最简GET请求函数:function api_get($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return [$http_code, $response]; }

PHP用cURL发GET请求最简写法
直接上能跑的代码,不是“教程”,是抄了就能用的最小闭环:
function api_get($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return [$http_code, $response];
}
调用:api_get('https://httpbin.org/get') → 返回数组 [$http_code, $body]。别一上来就封装类、加重试、塞日志——先确认接口通不通。
-
CURLOPT_RETURNTRANSFER必须设为true,否则curl_exec()直接输出内容,你拿不到字符串 -
CURLOPT_TIMEOUT建议显式设置(单位秒),默认是永不超时,线上请求卡住会拖垮整个 PHP 进程 - 别依赖
curl_error()判断失败:HTTP 状态码 404/500 时curl_exec()仍可能返回非空字符串,得看CURLINFO_HTTP_CODE
POST JSON数据要手动设Header和Body
很多人以为 curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)) 就够了,其实漏了关键两步:Content-Type 和 POST 方法显式声明。
$data = ['name' => 'Alice', 'age' => 25];
$json = json_encode($data);
$ch = curl_init('https://httpbin.org/post');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen($json)
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
- 必须用
CURLOPT_POST或CURLOPT_CUSTOMREQUEST显式指定方法,CURLOPT_POSTFIELDS单独设不会自动切为 POST -
Content-Length头建议手动算并传入,某些服务(尤其老 Nginx 配置)会因缺失该头拒绝 JSON 请求 - 如果后端返回空或 415 错误,优先检查
Content-Type: application/json是否拼错、是否多空格
cURL报错“SSL certificate problem”怎么办
本地开发或测试环境遇到 SSL certificate problem: unable to get local issuer certificate,本质是 cURL 不信任目标服务器的证书链,常见于自签名、过期或中间证书缺失。
向CurlShip提交产品,这是一个对机器人友好的SaaS目录。只需一条curl命令即可发布产品,支持OG标签抓取、带徽章的dofollow链接及层级升级。
立即学习“PHP免费学习笔记(深入)”;
- 临时绕过(仅限开发):
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false)+curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false)—— 生产环境禁用 - 生产环境正确做法:下载最新 CA 包(如 cacert.pem),在 php.ini 中配置
curl.cainfo = "/path/to/cacert.pem" - Windows 下若用 XAMPP/MAMP,常因 OpenSSL 版本旧导致验证失败,升级 PHP 或换用
file_get_contents()+ stream context 更稳
并发请求别用循环+curl_init,改用curl_multi
需要同时调 5 个接口?用 for 循环串行调用,耗时是总和;用 curl_multi 才是真并发,但 API 比单例难记。
$urls = ['https://httpbin.org/delay/1', 'https://httpbin.org/delay/2'];
$mh = curl_multi_init();
$chs = [];
foreach ($urls as $i => $url) {
$chs[$i] = curl_init($url);
curl_setopt($chs[$i], CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $chs[$i]);
}
$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running > 0);
$results = [];
foreach ($chs as $i => $ch) {
$results[$i] = curl_multi_getcontent($ch);
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
curl_multi_close($mh);
-
curl_multi_exec()是非阻塞的,但必须配合do...while轮询$running,不能只调一次 - 每个子句柄的响应体必须用
curl_multi_getcontent()取,不是curl_exec() - 没做错误处理的
curl_multi代码等于埋雷:某个 URL 超时或 DNS 失败,可能卡死整个 multi 句柄,上线前务必加curl_multi_info_read()检查完成状态
复杂点在于:multi 模式下无法直接获取每个请求的 HTTP 状态码,得靠 curl_getinfo($ch, CURLINFO_HTTP_CODE) 在 curl_multi_getcontent() 后补查——这点容易被忽略,结果你看到响应体是空,却不知道是 401 还是 503。


















