用PHP发出HTTP / 1.1请求

时间:2010-04-21 16:47:53

标签: php http

我的代码正在使用file_get_contents()向API端点发出GET请求。看起来它正在使用HTTP/1.0,我的系统管理员说我需要使用HTTP/1.1。如何发出HTTP/1.1请求?我需要使用卷曲还是有更好/更简单的方法?

更新

我决定使用cURL,因为我使用的是PHP 5.1.6。我最终通过执行此操作强制执行HTTP / 1.1:

curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

如果我使用的是5.3或更高版本,我会尝试这样做:

$ctx = stream_context_create(array(
    'http' => array('timeout' => 5, 'protocol_version' => 1.1)
    ));
$res = file_get_contents($url, 0, $ctx);
echo $res;

http://us.php.net/manual/en/context.http.php

  

注意:5.3.0之前的PHP没有   实现分块传输解码。   如果此值设置为1.1,则为您的值   责任是1.1合规。

我发现可能提供HTTP / 1.1的另一个选项是使用HTTP extension

2 个答案:

答案 0 :(得分:3)

在任何一种情况下我都会使用cURL,它会为您提供更多控制权,特别是它会为您提供超时选项。这在调用外部API时非常重要,以便在远程API关闭时不允许应用程序冻结。

可以这样:

# Connect to the Web API using cURL.
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'http://www.url.com/api.php?123=456'); 
curl_setopt($ch, CURLOPT_TIMEOUT, '3'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$xmlstr = curl_exec($ch); 
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

curl_close($ch);

cURL将默认使用HTTP / 1.1,除非您使用curl_setopt($s,CURLOPT_HTTPHEADER,$headers);指定其他内容,其中$ headers是一个数组。

答案 1 :(得分:2)

正如其他想要使用stream_context_create / file_get_contents的人所知,如果您的服务器配置为使用keep-alive连接,则响应将不会返回,您需要添加'protocol_version' => 1.1以及{{1} }。

以下示例:

'header' => 'Connection: close'