
PHP 的 CURLOPT_PUT 仅适用于上传文件,不能配合 CURLOPT_POSTFIELDS 发送 JSON 负载;应改用 CURLOPT_CUSTOMREQUEST => 'PUT' 并显式设置请求体与认证头。
php 的 `curlopt_put` 仅适用于上传文件,不能配合 `curlopt_postfields` 发送 json 负载;应改用 `curlopt_customrequest => 'put'` 并显式设置请求体与认证头。
在 PHP 中通过 cURL 发起标准的 RESTful PUT 请求(尤其是携带 JSON 数据)时,一个常见误区是误用 CURLOPT_PUT => true。该选项并非通用的 HTTP 方法切换开关,而是专为「上传本地文件」设计:它要求同时设置 CURLOPT_INFILE(文件句柄)和 CURLOPT_INFILESIZE(文件大小),否则 cURL 将忽略 CURLOPT_POSTFIELDS,导致请求体为空——这正是你遇到“数据未提交”“卡在 100 Continue 后超时”的根本原因。
✅ 正确做法是:使用 CURLOPT_CUSTOMREQUEST => 'PUT' 显式声明方法,并通过 CURLOPT_POSTFIELDS 传递 JSON 字符串,同时确保 Content-Type 和认证头正确配置。
以下是推荐的、健壮可复用的 PHP cURL PUT 实现:
<?php
$jsondata = json_encode([
'name' => 'Example',
'active' => true
]);
$authHeader = 'Basic ' . base64_encode($config['uag']['user'] . ':' . $config['uag']['pass']);
foreach ($serverurilist as $uri) {
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $uri,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_POSTFIELDS => $jsondata,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Content-Length: ' . strlen($jsondata), // 显式声明长度,避免 100-continue 陷阱
$authHeader
],
// 关键:禁用 Expect: 100-continue 行为(常引发阻塞)
CURLOPT_HTTPHEADER => array_merge(
['Content-Type: application/json', $authHeader],
[strlen($jsondata) > 0 ? 'Content-Length: ' . strlen($jsondata) : '']
),
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_VERBOSE => false, // 生产环境建议关闭
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$error = curl_error($curl);
curl_close($curl);
if ($response === false) {
throw new RuntimeException("cURL error ({$httpCode}): {$error}");
}
echo "URI: {$uri} → Status: {$httpCode}\n";
var_dump($response);
}? 关键注意事项:
立即学习“PHP免费学习笔记(深入)”;
-
永远不要混用
CURLOPT_PUT和CURLOPT_POSTFIELDS:前者是文件上传专用,后者用于表单/JSON 负载。 -
显式设置
Content-Length头:可有效规避服务器因等待100 Continue确认而挂起的问题(尤其在自签名证书或代理环境下)。 -
使用
Authorization: Basic ...替代CURLOPT_USERNAME/CURLOPT_PASSWORD:更可控,且兼容所有 cURL 版本;CURLOPT_USERNAME在部分旧版本中可能不触发 Basic 认证头。 -
禁用
Expect: 100-continue:若仍遇阻塞,可在CURLOPT_HTTPHEADER中加入'Expect:'(空值)彻底禁用该机制。 -
始终校验
curl_exec()返回值:false表示传输失败(非 HTTP 错误码),需结合curl_error()排查。
通过以上修正,你的 PHP PUT 请求将与命令行 curl -X PUT --data ... 行为完全一致,稳定提交 JSON 负载。



















