CURLOPT_PUT 对比 CURLOPT_POSTFIELDS

CURLOPT_PUT vs CURLOPT_POSTFIELDS

当我通过 curl 向 REST 发送 PUT 请求 API 时,我发现了奇怪的行为。如果设置参数curl_setopt($curl, CURLOPT_PUT, true),则查询,其中CURLOPT_POSTFIELDS 不为空,则查询执行持续 1.5 分钟(好像它取决于某个超时)。而如果用参数curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT")[=22=发送相同的请求],那么查询执行将持续大约 1 秒,这是应该的。有人可以解释一下这些参数之间的根本区别吗?

示例代码:

$data = http_build_query(array("enable"=> 1));

if( $curl = curl_init() ) {
    curl_setopt($curl, CURLOPT_URL, BASE_URL .'users/2');
    curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);    
    curl_setopt($curl, CURLOPT_PUT, true); // execution time 1.5 min
    //curl_setopt ($ curl, CURLOPT_CUSTOMREQUEST, "PUT"); - execution time 1 sec
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    $out = json_decode(curl_exec($curl));
    curl_close($curl);      
}

如果你查看 documentation,它说当你将 CURLOPT_PUT 设置为 true 时,PUT 的文件必须设置为 CURLOPT_INFILECURLOPT_INFILESIZE(在你的情况下你没有设置文件)。

CURLOPT_CUSTOMREQUEST 设置为 PUT 方法不需要文件,这是 CURLOPT_CUSTOMREQUESTCURLOPT_PUT 之间的主要区别。