在 PHP 中使用 CURL 发出 PUT 请求

Posted

技术标签:

【中文标题】在 PHP 中使用 CURL 发出 PUT 请求【英文标题】:Making a PUT request using CURL in PHP 【发布时间】:2012-02-29 16:05:21 【问题描述】:

我使用的是 php 5.3.6,但我似乎无法使用 CURL 发出 PUT 请求,只输入一个字符串。

function put_data($url, $data)
   
  $useragent="SimpleAgent-1.0";
  $fh = fopen('php://memory', 'rw');
  fwrite($fh, $data);
  rewind($fh);$ch = curl_init();
  curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
  curl_setopt($ch, CURLOPT_INFILE, $fh);
  curl_setopt($ch, CURLOPT_INFILESIZE, strlen($data));
  curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  curl_setopt($ch, CURLOPT_PUT, 1);
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $result = curl_exec($ch);
  curl_close($ch);
  fclose($fh);

  return $result;

这里,$data 是我要 PUT 的字符串。 不起作用并返回以下错误:

500 Internal Server Error 服务器出错或无法运行 执行请求的操作。

预期的字符串或缓冲区

【问题讨论】:

你的 PHP 有 error_log 吗? 尝试在倒带前关闭($fh);无论如何阅读apache日志 倒带后抱歉($fh); @ZiTAL:试过了。没用。 除了 CURL 方式之外,还有其他方法可以从 PHP 发出 PUT 请求吗? 【参考方案1】:

我使用您的代码定义了一个 url 并用一个字符串填充数据,一切都按预期工作。由于没有接收端可以处理看跌期权,因此我被网站拒绝了。要轻松获取信息,只需添加该行 curl_setopt($ch, CURLOPT_VERBOSE, true);

你会得到类似的东西:

* About to connect() to yyyy.xxxx.com port 80 (#0)
*   Trying 62.221.196.28...
* connected
* Connected to yyyy.xxxx.com (zz.221.196.28) port 80 (#0)
> PUT / HTTP/1.1
User-Agent: SimpleAgent-1.0
Host: yyyy.xxxx.com
Accept: */*
Content-Length: 14
Expect: 100-continue

< HTTP/1.1 100 Continue
* We are completely uploaded and fine
< HTTP/1.1 405 Method Not Allowed
< Date: Thu, 09 Feb 2012 19:46:28 GMT
< Server: Apache
< Allow: GET,HEAD,POST,OPTIONS
< Vary: Accept-Encoding
< Content-Length: 231
< Content-Type: text/html; charset=iso-8859-1
< 
* Connection #0 to host yyy.xxxx.com left intact
* Closing connection #0

从日志中可以看出,请求已发出,但是当您要放置数据时,apache 设置不允许您将数据放置到该 url。因此,根据服务器,您将不得不处理接受 PUT 的接收 url。

【讨论】:

您好 user1200241,您使用的是哪个版本的 PHP?我发布的代码似乎适用于旧版本的 PHP。请告诉我。 嗨 Bijoy 我确实升级到了最新的 php 5.3.10 版本,因为我在做其他测试时遇到了内存泄漏问题。我在 cli 下运行了您的示例,最有用的扩展是获取真实进度信息的详细选项。安东【参考方案2】:

我只能使用我正在使用的版本将数组作为数据传递。所以这就是我现在正在做的事情:

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);
curl_setopt($ch, CURLOPT_COOKIE, $curl_cookie);
$arr = array();
if (isset($data)) 
    $arr['my_data'] = $data;


curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($arr));
curl_exec($ch);

【讨论】:

以上是关于在 PHP 中使用 CURL 发出 PUT 请求的主要内容,如果未能解决你的问题,请参考以下文章

PHP 卷曲 HTTP PUT

LIFX 电源开/关的 PHP HTTP CURL PUT 请求

PHP Curl PUT 在 curl_exec 处停止

使用 API PUT 请求上传文件

如何使用curl在php中调试get请求

PHP/Curl:在下载正文之前检查响应标头