php周边技术有点多,每个人关注和遇到的点都不一样,有时候面试经常碰到面试官问的知识点之前没接触过或者了解的不多,直接被pass。虽然挺讨厌这样以偏概全,但是没办法只能多从自身找问题,于是把历次面试遇到的还有听到的都写在这里留个记录。(ps:没有顺序)
------------------------------------------------------------------------------
websocket
http协议是典型的 请求响应 模式,要是服务端想主动联系客户端那基本是没办法的,记得最开始网站上有那种新消息提醒的功能,都是ajax轮询的去做,这种既耗资源,对服务器压力也很大。
websocket出现就解决了这个问题,客户端和服务端建立连接后谁都可以主动给对方发送消息。当然它也是建立在tcp之上,与http的兼容性也很好(端口也是80,443,握手使用http),可以发送文本和二进制,而且是没有同源的限制。协议名称 ws 、wss
客户端:
GET /you/websocket/ HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: acDE8ImOPfgJNRINxcclLi==
Sec-WebSocket-Protocol: chat, superchat
Origin: http://localhost.lo
Sec-WebSocket-Version: 13
Upgrade:websocket 参数说明这是 WebSocket 类型请求
Connection: Upgrade
上面这俩是核心,告诉服务器发起的是websocket连接
Sec-WebSocket-Key 参数是 WebSocket 客户端发送的一个 base64 编码的密文,浏览器随机生成的,要求服务端必须返回一个对应加密的Sec-WebSocket-Accept应答
Sec-WebSocket-Protocol: chat, superchat 是一个用户定义的字符串,用来区分同URL下,不同的服务所需要的协议
服务端
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: dGhlIHNhbXBsZSBub25jZQ=
Sec-WebSocket-Protocol: chat
握手完事后就可以交互了。
防盗链
盗链就是比如你网站上有一个图片,完后别人网站直接引用你的图片,对你来说一是访问别人网站的流量有一部分压到你这儿了,而且还没给你带来什么好处。 这种行为当然要禁止,这就是防盗链,有防盗链就有反防盗链,互相掐。
别人引用我们的图片,这会产生一个http 的 get 请求,浏览器会自动为我们带上一个头(Referer),标识来源。Referer是HTTP Header的一部分,当浏览器向网站Web服务器发送请求的时候,一般会带上Referer,告诉服务器此次请求是从哪个页面链接过来的。
跨域
jsonp
JSON with Padding 的缩写,就是 script 标签不受同源策略的限制,服务端返回一个函数的调用代码,把数据传到参数中。
服务端返回
parseResponse({"Name": "Cheeso", "Id" : 1823, "Rank": 7})
cors
跨域资源共享,需要客户端和服务端同时支持,如果发现请求是跨域,就会自己加一个头,不需要用户干预
GET /news/notice HTTP/1.1
Host: s.def.com
Connection: keep-alive
Accept: application/json, text/plain, */*
Origin: https://www.abc.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36
Client-Lang: zh-CN
Referer: https://www.abc.com/documentary
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4
Origin 表示请求来自那。如果Origin指定的源,不在许可范围内,服务器会返回一个正常的HTTP回应。
HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Tue, 26 Sep 2017 01:23:00 GMT
Content-Type: application/json; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/7.1.0
Access-Control-Allow-Origin: https://www.abc.com
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,Client-Lang,Client-Source
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE
PS: 1
Content-Encoding: gzip
如果来源是在允许的列表中,响应头中就会包含 Access-Control-Allow-Origin
如果请求头中 Content-Type :application/json 或者非 get 、post 还会多一次 option 请求,用来确认来源是否在允许范围内,以及支持的动作。得到确认后才会进行后续请求。
OPTIONS /star/top-ranks?expand=copyStatus HTTP/1.1
Host: s.abc.com
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: https://www.ubankfx.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36
Access-Control-Request-Headers: client-lang
Accept: */*
Referer: https://www.abc.com/documentary
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4
服务器收到请求以后,检查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段以后,确认允许跨源请求,并响应。
HTTP/1.1 204 No Content
Server: nginx/1.10.2
Date: Tue, 26 Sep 2017 01:23:00 GMT
Connection: keep-alive
Access-Control-Allow-Origin: https://www.abc.com
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,Client-Lang,Client-Source
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE
Access-Control-Max-Age: 1728000
Access-Control-Allow-Origin 表示可以跨域,*号表示允许任意源跨域。如果返回头中不包括 cors相关的头信息表示不允许。
http
redis
memcache
mongodb
单点登录
压测
php新特性
框架之间的区别
算法
安全
设计模式
待续