使用PHP发起HTTP/1.1请求

7
我的代码使用file_get_contents()来向API端点发起GET请求。看起来它在使用HTTP/1.0,我的系统管理员告诉我需要使用HTTP/1.1。我怎样才能发起一个HTTP/1.1的请求?我需要使用curl吗?还是有更好/更容易的方法?

更新

考虑到我使用的是PHP 5.1.6,我决定使用cURL。我最终通过以下方式强制使用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

注意:PHP版本在5.3.0之前不支持分块传输解码。如果将此值设置为1.1,则需要确保与HTTP/1.1兼容。

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

2个回答

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是一个数组。


2

如果你的服务器配置了keep-alive连接,想要使用stream_context_create/file_get_contents方法获取响应内容将会失败。此时需要添加 'protocol_version' => 1.1'header' => 'Connection: close' 两个选项。以下是一个例子:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接