PHP精讲2021—从Yii2源码Response看web响应考察哪些知识点
生活中没有弱者,仅有不愿努力的人。 🐮

一、前言
不管你是做接口还是做网站,都避免不了要返回数据给前端。
不管你的前端是js还是iOS,你的服务器数据总要返回出来。
不管你是token验证还是session校验,你总是要返回身份认证。
二、源码分析
Yii2的响应类Response的所在位置是vendor/yiisoft/yii2/web/Response.php,web相关的请求都会走这个类的方法。
1. 执行流程
web返回网页请求数据的流程是
- 判断是否已经发送完成
- 执行发送前的触发器
- 准备工作
- 执行准备后的触发器
- 发送响应头部
- 发送响应内容
- 执行发送后的触发器
- 设置发送状态为已发送
除去各个动作的触发器和状态判断,Yii2的核心流程有三点
- 准备。根据设置的格式对响应内容进行格式化。
- 发送响应头部。具体的操作有
- 设置
header() - 设置HTTP状态码
- 发送cookies
- 设置
- 发送响应内容。
2. HTTP状态码
httpStatuses被保存在一个静态变量里,也就是说实际业务中最常用的状态码就是这些。我们可以通过setStatusCode()方法设置返回的状态码。
/**
* @var array list of HTTP status codes and the corresponding texts
*/
public static $httpStatuses = [
100 => 'Continue',
101 => 'Switching Protocols',
102 => 'Processing',
118 => 'Connection timed out',
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
203 => 'Non-Authoritative',
204 => 'No Content',
205 => 'Reset Content',
206 => 'Partial Content',
207 => 'Multi-Status',
208 => 'Already Reported',
210 => 'Content Different',
226 => 'IM Used',
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
306 => 'Reserved',
307 => 'Temporary Redirect',
308 => 'Permanent Redirect',
310 => 'Too many Redirect',
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
405 => 'Method Not Allowed',
406 => 'Not Acceptable',
407 => 'Proxy Authentication Required',
408 => 'Request Time-out',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Request Entity Too Large',
414 => 'Request-URI Too Long',
415 => 'Unsupported Media Type',
416 => 'Requested range unsatisfiable',
417 => 'Expectation failed',
418 => 'I\'m a teapot',
421 => 'Misdirected Request',
422 => 'Unprocessable entity',
423 => 'Locked',
424 => 'Method failure',
425 => 'Unordered Collection',
426 => 'Upgrade Required',
428 => 'Precondition Required',
429 => 'Too Many Requests',
431 => 'Request Header Fields Too Large',
449 => 'Retry With',
450 => 'Blocked by Windows Parental Controls',
451 => 'Unavailable For Legal Reasons',
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway or Proxy Error',
503 => 'Service Unavailable',
504 => 'Gateway Time-out',
505 => 'HTTP Version not supported',
507 => 'Insufficient storage',
508 => 'Loop Detected',
509 => 'Bandwidth Limit Exceeded',
510 => 'Not Extended',
511 => 'Network Authentication Required',
];
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
对于服务端返回给客户端的数据,HTTP的状态码是非常有意义的。
有的同学不善于使用状态码,如果有异常,就写在响应内容里,但是这样就相当于放弃状态码设置的意义。
比如文件上传过大,约定俗成的状态码就是413,那么前端在拿到请求之后,可以优先识别状态码,不去解析返回值,就能在界面给用户提示,“文件过大,我忍不下。”
3. 返回格式
const FORMAT_RAW = 'raw';
const FORMAT_HTML = 'html';
const FORMAT_JSON = 'json';
const FORMAT_JSONP = 'jsonp';
const FORMAT_XML = 'xml';
- 1
- 2
- 3
- 4
- 5
YIi2框架内部给出的返回格式有四种
- raw
- html
- json
- jsonp
- xml
这几个格式不难理解,我在这里说下json和jsonp的区别
这是json,返回的Content-Type的值是application/json
{"name": "xiaoyutongxue"}
- 1
而jsonp返回的Content-Type的值是text/javascript,前端可以直接使用jsonpCallback进行回调。
4. 响应头

Yii2的响应头部发送是通过header()函数进行的,注意的是header()之前是不能有输出的,不然就会报错。
headers_sent()可以检测是不是之前已经有header输出了。
header("HTTP/{$this->version} {$statusCode} {$this->statusText}");
- 1
这就是响应中判断状态码的输出部分。
HTTP/1.1 200 OK
Cooike也是响应头的一部分,核心的PHP方法是通过setcookie()实现的,最终的输出结果是
Set-Cookie: PHPSESSID=815*****1lmp0k1; expires=Fri, 10-Sep-2021 08:44:18 GMT; Max-Age=2592000; path=/; domain=blog.csdn.net/diandianxiyu_geek; HttpOnly
- 1
而cooike最后会被浏览器拿到存在本地

5. 快捷方法
在响应类里,框架给出了几个直接使用的方法,这样就不需要自己去设置响应头部了
sendFile()下载文件redirect()跳转页面
这里不作为重点讲解。

三、知识点汇总
1. HTTP状态码
HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。它由 RFC 2616 规范定义的,并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等规范扩展。
所有状态码的第一个数字代表了响应的五种状态之一。





2. 301和302的区别
301重定向表示资源的永久迁移,一般网站改版地址变化会采用301。
302重定向表示暂时的资源移动,原来的资源还是有效的。
3. 浏览器是如何获取Cookie的
PHP端使用setcookie()函数设置。返回响应的header中字段为Set-Cookie,可以设置多个并返回多个。
四、总结
我们能通过阅读框架源码理解项目中的每个步骤的具体操作,并能在此学到相关的基础知识,这些知识可以被用在实际项目中或者面试题里,还可以潜移默化提高自己的内功。

文章来源: coderfix.blog.csdn.net,作者:小雨青年,版权归原作者所有,如需转载,请联系作者。
原文链接:coderfix.blog.csdn.net/article/details/119631757
- 点赞
- 收藏
- 关注作者
评论(0)