【问题标题】:What is the importance of setting CURLOPT_HTTP_VERSION in an application?在应用程序中设置 CURLOPT_HTTP_VERSION 的重要性是什么?
【发布时间】:2013-10-01 17:14:41
【问题描述】:

在别人的代码中,我遇到了 cURL 的这个选项设置:

curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

PHP 文档说默认情况下此选项设置为 CURL_HTTP_VERSION_NONE,这让 cURL 决定使用哪个 HTTP 版本。否则,您可以强制使用 HTTP 1.0 或 HTTP 1.1。总有一天会出现强制使用 HTTP 2.0 的选项(请参阅 cURL 邮件列表中的此线程:http://curl.haxx.se/mail/lib-2013-09/0020.html

我仍在尝试从问题 HTTP 1.0 vs 1.1 中了解 HTTP 1.0 与 1.1 之间的区别,现在我想知道 HTTP 2.0 的未来需要什么样的考虑因素。

我的问题是:

  • 如果我不能始终确定服务器支持什么 HTTP 版本,在应用程序中设置 CURLOPT_HTTP_VERSION 是个好主意吗?或者我应该使用 $_SERVER['SERVER_PROTOCOL'] 检测版本并基于此更改 CURLOPT_HTTP_VERSION 吗?

  • 如果我知道服务器能够支持 HTTP 1.1(或将来的 HTTP 2.0),是否有理由认为 cURL 无法解决这个问题?

  • 是否存在使用 HTTP 1.0 比使用 HTTP 1.1 更好的情况?

【问题讨论】:

  • cURL 很聪明,让它自己弄清楚。基本上它会使用最新的版本,如果不支持则回退到以前的版本。 HTTP 1.0 和 1.1 之间的差异是相当深奥的,并且在 PHP 应用程序的上下文中很少出现问题,因为 apache/nginx/iis/etc 在请求到达 PHP 之前处理了几乎所有事情。

标签: php http curl


【解决方案1】:
  1. 我没有看到任何好处。让 curl 来处理。

  2. Curl 会为您做到这一点。而且我很确定未来的 HTTP 2.0 不会破坏向后兼容性。

  3. 正如HTTP 1.0 vs 1.1 中所述,首选 HTTP 1.0 的唯一正当理由是您无法向服务器发送 Host 标头。但老实说,我无法想象现实世界的情况。

【讨论】:

  • 我刚刚遇到了一个真实世界的场景。 Squid 代理(3.2 版)无法正确处理来自服务器的 HTTP 1.1 100-continue 响应,因此发送 HTTP 1.1 PUT(带有 HTTP 1.1 Excpect: 100-continue 标头)的客户端确实收到了来自代理的 417 Expectation Failed .强制 curl 使用 HTTP 1.0 来解决这个代理问题。
  • 遇到与@Sascha +1 相同的问题
【解决方案2】:

我有一个旧的 PHP 应用程序在服务器上运行,该服务器的 PHP/libcurl 版本不支持 HTTP 2。它向外部 API 发出请求并检查响应标头以确定下一步该做什么。但是这段旧代码只设计用于处理 HTTP 1.0 和 HTTP 1.1 标头。

如果应用程序安装在支持 HTTP 2 的服务器上,curl 将选择使用它,应用程序将中断。因此,如果不更改代码,我无法将其安装在较新的服务器上或升级当前服务器。

在这种情况下,将应用程序更改为使用 HTTP 1.1(已知可以工作)比更改代码的许多部分以检查各种可能的新响应标头要简单得多。

【讨论】:

  • 感谢真实世界的例子。 2013 年我第一次提出这个问题之前,我们中的许多人仍在处理大量遗留代码。根据多年来不断涌现的投票,这对某些人来说仍然是一个相关问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 2011-01-15
  • 2010-11-18
  • 2012-07-02
相关资源
最近更新 更多