必须显式设置curlopt_returntransfer为true,否则curl_exec()默认直接输出响应体而非返回字符串,导致无法获取内容进行后续处理或解析。

curl_init() 之后必须显式设置 CURLOPT_RETURNTRANSFER
不设这个选项,curl_exec() 默认直接输出响应体,而不是返回字符串——这意味着你拿不到响应内容做后续判断或解析。尤其在 API 调用、表单提交后要检查返回 JSON 或跳转状态时,这一步漏掉会导致逻辑中断但无报错。
常见错误现象:curl_exec() 返回 bool(true),但变量里空空如也;或者响应头/HTML 直接刷到浏览器上,破坏 JSON 输出。
- 务必在
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true)后再调用curl_exec() - 如果需要同时捕获响应头,加
curl_setopt($ch, CURLOPT_HEADER, true),但注意此时返回值包含头+体,需手动分离 -
CURLOPT_RETURNTRANSFER是布尔值,传1或true都行,但别传字符串"true"(PHP 会当true,但语义不清)
POST 数据格式决定 Content-Type 和参数写法
不是所有 POST 请求都该用 http_build_query()。后端接收逻辑不同,前端发送格式就得匹配,否则 $_POST 为空或解析失败。
父母的功课——育儿心理学对话支持技能(心虫增强版)。提供结构化对话、情绪识别、场景匹配与安全检测;可选Python脚本(scripts/)在SKILL_DIR/data/本地存储评估历史、洞察与会话状态,不对外传输。核心路径:觉察(看见防御)→接纳(慈悲是……
典型场景分三类:
-
表单提交(application/x-www-form-urlencoded):用
http_build_query(['user' => 'a', 'pass' => 'b']),并显式设curl_setopt($ch, CURLOPT_POSTFIELDS, $data);此时无需手动设Content-Type,cURL 会自动补 -
JSON 接口(application/json):先
json_encode(['user' => 'a', 'pass' => 'b']),再设curl_setopt($ch, CURLOPT_POSTFIELDS, $json),并手动加头:curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']) -
文件上传(multipart/form-data):直接传数组,键为字段名,值为
@/path/to/file(PHP 5.6+ 推荐用CURLFile对象),cURL 自动处理边界和头
忽略 SSL 验证的临时方案只该用于开发环境
遇到 cURL error 60: SSL certificate problem,第一反应不该是关验证,而是查证书链或换用系统 CA 包。生产环境硬关 CURLOPT_SSL_VERIFYPEER 和 CURLOPT_SSL_VERIFYHOST 等同于裸奔。
- 开发调试可临时加:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false)和curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false) - 更稳妥的做法是下载最新 CA 包(如 curl.se/ca),然后设
curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem') - 某些内网服务用自签名证书,可导出公钥后指定
CURLOPT_SSLCERT,而非全局禁用校验
超时和错误处理不能只靠 curl_exec() 返回值
curl_exec() 失败时返回 false,但这掩盖了具体原因。比如 DNS 解析失败、连接被拒、超时,都返回 false,但处理方式完全不同。
- 执行前设超时:
curl_setopt($ch, CURLOPT_TIMEOUT, 10)(单位秒),避免请求卡死进程 - 执行后立刻检查:
if (false === $res = curl_exec($ch)) { echo curl_error($ch); } - 获取 HTTP 状态码:
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE),200不代表业务成功,得看响应体内容 - 记得
curl_close($ch),尤其在循环中反复发起请求时,不释放句柄会耗尽资源
CURLOPT_RETURNTRANSFER 和对 curl_getinfo() 的调用——前者让代码看似运行了却没结果,后者让你误以为“请求成功”而忽略服务端返回的错误码或提示。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










