curl 请求需显式设置 user-agent 等头部、json post 要 json_encode() 并设 content-type、禁用 ssl 校验仅限调试、超时应拆分连接与读取阶段毫秒级控制。

curl_init() 之后必须调用 curl_setopt() 配置 User-Agent
PHP 的 curl_init() 默认不发 User-Agent,很多网站(尤其是带反爬逻辑的)会直接返回 403 或空响应。这不是 cURL 失败,而是服务端主动拒绝——你得告诉对方“我是个浏览器”。
实操建议:
- 至少设置
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'),不用太长,但不能空或默认值 - 如果目标站校验严格(比如登录页、JS 渲染页),补上
Accept和Accept-Language:curl_setopt($ch, CURLOPT_HTTPHEADER, ['Accept: text/html,application/xhtml+xml', 'Accept-Language: zh-CN,zh;q=0.9']) - 别用随机 UA 库生成超长字符串——某些 CDN(如 Cloudflare)会因 UA 过长直接拦截
POST 请求里传数组要手动 json_encode(),别直接塞给 CURLOPT_POSTFIELDS
很多人写 curl_setopt($ch, CURLOPT_POSTFIELDS, $data),其中 $data 是 PHP 关联数组,结果接口收不到字段,或者返回 400 Bad Request。cURL 不会自动把数组转成 JSON,它默认按 application/x-www-form-urlencoded 编码——而现代 API 几乎都要求 JSON。
实操建议:
- 确认接口文档要求的 Content-Type:是
application/json还是application/x-www-form-urlencoded - 如果是 JSON,必须先
$json = json_encode($data),再设CURLOPT_POSTFIELDS,并显式加 header:curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']) - 如果是表单提交,用
http_build_query($data)而不是json_encode(),否则后端$_POST为空
忽略 SSL 证书验证只该用于本地调试,上线必须关掉 CURLOPT_SSL_VERIFYPEER
开发时遇到 cURL error 60: SSL certificate problem,有人习惯性加 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false) ——这会让请求跳过证书链校验,HTTPs 变成“裸连”,中间人攻击风险拉满。
向CurlShip提交产品,这是一个对机器人友好的SaaS目录。只需一条curl命令即可发布产品,支持OG标签抓取、带徽章的dofollow链接及层级升级。
实操建议:
- 生产环境永远保持
CURLOPT_SSL_VERIFYPEER为true(默认值),同时配CURLOPT_CAINFO指向系统 CA 包,例如:curl_setopt($ch, CURLOPT_CAINFO, '/etc/ssl/certs/ca-certificates.crt') - Windows 下 PHP 可能没内置 CA 包,得单独下载
curl-ca-bundle.crt并指定路径;Mac 用 Homebrew 安装的 PHP 通常已配置好 - 如果目标域名用了私有 CA(比如企业内网 HTTPS),才考虑临时加
CURLOPT_SSL_VERIFYHOST => false,且仅限可信内网
超时设置不光看 CURLOPT_TIMEOUT,还得拆开控制连接和读取阶段
只设 CURLOPT_TIMEOUT => 30,看似保险,但遇到 DNS 卡住或服务器 SYN 包丢弃时,实际可能卡满 30 秒才报错。用户感知就是“页面突然卡住半分钟”,体验极差。
实操建议:
- 拆开设两个超时:
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 3000)(连接阶段毫秒级) +curl_setopt($ch, CURLOPT_TIMEOUT_MS, 10000)(总耗时毫秒级) - 避免用
CURLOPT_TIMEOUT(秒级),它最小单位是 1 秒,不够精细;_MS后缀才是真·毫秒控制 - 如果请求涉及重定向(
CURLOPT_FOLLOWLOCATION开启),记得CURLOPT_TIMEOUT_MS会累加所有跳转耗时,必要时单独控CURLOPT_MAXREDIRS
真正难处理的是 DNS 缓存失效、TCP TIME_WAIT 爆满、远端服务 TCP keepalive 时间不一致这些底层问题——cURL 参数调得再细,也盖不住网络栈本身的不确定性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










