
PHP 的 CURLOPT_PUT 仅适用于上传文件,不能用于发送请求体数据;若需发送 JSON 负载,必须改用 CURLOPT_CUSTOMREQUEST => 'PUT' 并配合 CURLOPT_POSTFIELDS,同时确保设置正确的 Content-Type 和认证头。
php 的 `curlopt_put` 仅适用于上传文件,不能用于发送请求体数据;若需发送 json 负载,必须改用 `curlopt_customrequest => 'put'` 并配合 `curlopt_postfields`,同时确保设置正确的 `content-type` 和认证头。
在 PHP 中通过 cURL 向 REST API 发送 PUT 请求时,一个常见误区是误用 CURLOPT_PUT => true。该选项并非通用的 HTTP 方法切换开关,而是专为「上传本地文件」设计的:它要求同时指定 CURLOPT_INFILE(文件句柄)和 CURLOPT_INFILESIZE(文件大小),否则 cURL 将忽略 CURLOPT_POSTFIELDS,导致请求体为空——这正是你遇到“数据未提交”“卡在 100 Continue 后超时”的根本原因。
✅ 正确做法是:显式声明请求方法为 PUT,并手动设置请求体与头部。以下是推荐的完整实现:
$curl = curl_init();
// 构建基础认证头(Base64 编码)
$authHeader = 'Authorization: Basic ' . base64_encode($config['uag']['user'] . ':' . $config['uag']['pass']);
curl_setopt_array($curl, [
CURLOPT_URL => $uri, // 注意:应在循环内单独设置每个 URI
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT', // ✅ 关键:声明 HTTP 方法
CURLOPT_POSTFIELDS => $jsondata, // ✅ JSON 字符串直接作为请求体
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
$authHeader
],
CURLOPT_SSL_VERIFYPEER => false, // 仅开发环境使用;生产务必启用证书验证
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_ENCODING => '', // 支持自动解压
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
$error = curl_error($curl);
$errno = curl_errno($curl);
throw new RuntimeException("cURL error ({$errno}): {$error}");
}
curl_close($curl);
// 建议检查 HTTP 状态码
if ($httpCode >= 400) {
throw new RuntimeException("API request failed with HTTP {$httpCode}: " . $response);
}
echo $response;
? 关键注意事项:
- ❌ 避免
CURLOPT_PUT:除非你真的在上传文件(如fopen('data.json', 'r')+CURLOPT_INFILE),否则一律不用; - ✅
CURLOPT_CUSTOMREQUEST => 'PUT'是发送任意请求体(JSON、表单、原始字符串)的标准方式; - ✅ 认证推荐使用
Authorization: Basic ...头而非CURLOPT_USERNAME/CURLOPT_PASSWORD(后者在部分 cURL 版本中可能与CUSTOMREQUEST冲突); - ✅ 在循环中调用
curl_setopt($curl, CURLOPT_URL, $uri)前,必须确保前一次请求已执行完毕(即curl_exec()已调用),否则 URL 可能未及时更新; - ⚠️
CURLOPT_SSL_VERIFYPEER => false和CURLOPT_SSL_VERIFYHOST => false会禁用 HTTPS 安全校验,请仅用于调试;生产环境务必配置有效的 CA 证书(如CURLOPT_CAINFO => '/path/to/cacert.pem')。
通过以上修正,PHP cURL 将严格模拟命令行 curl -X PUT --data ... 的行为:正确发送 Expect: 100-continue、接收 100 Continue 后立即传输 JSON 负载,不再因方法配置错误而中断。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











