PSR-7 HTTP消息接口规范的建议解读

概述

PSR-7规范被提出的目的是为RFC 7230RFC 7231中描述的HTTP消息提供一组公共接口,并在RFC 3986(在HTTP消息的上下文中)中描述URI。

所有HTTP消息都包含正在使用的HTTP协议版本,标头和消息正文。 Request基于消息构建,以包括用于发出请求的HTTP方法以及发出请求的URI。 响应包括HTTP状态代码和原因。

在PHP中,HTTP消息在两个上下文中使用:

  • PHP通过curl扩展发送HTTP请求,并处理收到的HTTP响应。 换句话说,当使用PHP作为HTTP客户端时,使用HTTP消息。
  • 处理传入到服务器的HTTP请求,并向发出请求的客户端返回HTTP响应。 当用作服务器端应用程序来完成HTTP请求时,PHP可以使用HTTP消息。

该提议提供了一个API,用于完整描述PHP中各种HTTP消息的所有部分。

在PHP中的HTTP消息

PHP没有内置的HTTP消息支持。

客户端HTTP支持

PHP支持通过以下几种机制发送HTTP请求:

  • PHP流
  • cURL扩展
  • ext/http(v2也尝试解决服务器端支持)

PHP流是发送HTTP请求的最方便和最普遍的方式,但在正确配置SSL支持方面存在许多限制,并且在设置诸如消息头之类的东西时, 接口还是比较麻烦。 cURL提供了完整且扩展的功能集,但由于它不是默认安装的扩展,因此有很多情况下, 开发人员无法使用它。 http扩展遇到的问题和cURL相同,以及它在实际开发中使用的更少。

大多数现代HTTP客户端库倾向于抽象的实现方式,这样可以确保它们可以在任何环境中正常工作。

服务器端HTTP支持

PHP使用 SAPI (以及后来的FPM) 来解释从服务器(Apache/Nginx)传入的HTTP请求,编组输入以及将处理传递给脚本。 最初的SAPI设计镜像了CGI(通用网关接口),它可以在将委托传递给脚本之前, 封装请求数据并将其推送到环境变量中; 然后,脚本将从环境变量中提取,以处理请求并返回响应。

PHP的SAPI设计通过超级全局变量(分别为$ _COOKIE,$ _GET和$ _POST)抽象出常见的输入源,如cookie,查询字符串参数和url编码的POST内容,为Web开发人员提供了一层便利。

在响应方面,PHP最初是作为一个模板语言被开发出来的,并允许混合HTML和PHP语法; 文件的任何HTML部分都会立即刷新到输出缓冲区。 现代应用程序和框架避开了这种做法,因为它可能导致发出状态行和/或响应头的问题; 它们倾向于聚合所有标题和内容,并在所有其他应用程序处理完成时立即发出它们。需要特别注意确保错误报告和将内容发送到输出缓冲区的其他操作不会刷新输出缓冲区。