月下博客

PHP回顾之web响应

PHP回顾系列目录

web响应

与客户端请求相对应的是服务端请求。同请求类似,响应包含三部分:状态码、头部(header)和正文(body)。

状态码

状态码是指示响应成功与否的代码,常见的代码从1xx-5xx。左耳朵耗子微博上的一张图可以很好的概况各类状态码的含义:

如果自作主张一些,客户端可以根据状态码而决定是否解析正文。例如对于30x系列,正文的内容无关紧要(浏览器默回直接请求跳转网址而略过显示源页面正文);对于20x, 40x和50x系列,正文包含了请求的主体内容,应该正确的解析和显示。

PHP可以使用http_response_code来获取和设置响应的状态码。

头部

同请求类似,头部的相关信息会放到头部段。注意这里说的头部(header)与HTML文档中的头部(head)不同,因为服务端发送的不一定是HTML。 例如cookie、文档格式等信息,放在响应头部里传递给客户端,但这些信息不能放在HTML文档中的head标签中。图片、音视频等,不是格式化的文档,没有head标签,所以文档格式需要放在响应的头部中。

头部中的诸多信息,与请求带过来的类似,例如常见的文档格式、可接受的编码等。服务端也可设置自定义的头部信息。

PHP通过header函数来设置请求的头部信息(cookie则使用setcookie函数)。由于头部信息应该在正文之前,发送过正文后调用header函数会出现警告。

正文

除特殊情形外,正文是请求的主体,其中最为关键的一部分。常见的正文是HTML文档,浏览器解析渲染后展现给用户。诸如PDF、图片、XML等格式的响应正文,浏览器基本也能直接渲染显示。如果浏览器无法解析渲染正文,例如exe文件、音视频文件,就会提示用户下载。

PHP的许多功能和函数会影响到正文输出。由于PHP是嵌入式脚本,内嵌的HTML将会被直接发送;纯PHP脚本中,echo, print, var_dump、var_export等系列函数会将结果直接发送;exit/die, system, exec、phpinfo等函数也会将结果发送;同时,输出控制的系列函数(如ob_start, ob_get_contents)会影响输出时机和结果。

总结

由于历史原因,PHP许多功能显得比较杂乱,设计上欠缺整体考虑。这也是PHP的优点之一:学习容易,快速上手,有多种手段解决一个事情。对于中大型项目,维护的成本比开发高很多,对规范化和可维护的需求也就更高。现代化的框架,如Yii, Laravel等,使用了许多前卫的开发规范和最佳实践,建议多学习和使用。