2021年12月PHP面试题总结
01
为什么要跨域?
跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。
下表给出了与 URL http://store.company.com/dir/page.html 的源进行对比的示例:
URL 结果 原因
http://store.company.com/dir2/other.html 同源 只有路径不同
http://store.company.com/dir/inner/another.html 同源 只有路径不同
https://store.company.com/secure.html 失败 协议不同
http://store.company.com:81/dir/etc.html 失败 端口不同 ( http:// 默认端口是80)
http://news.company.com/dir/other.html 失败 主机不同
02
Socket为什么需要心跳?
在smack里有个30s发送一个空消息的线程,同样关于心跳包(keepalive)
据网络搜索到的资料解释如下
内网机器如果不主动向外发起连接,外网机没法直连内网的,这也是内网机安全的原因之一,又因为路由器会把这个关系记录下来,但是过一段时间这个记录可能会丢失 ,所有每一个客户端每隔一定时间就会向服务器发送消息,以保证服务器可以随时找到你,这东西被称为心跳包。
理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活。在获知了断线之后,服务器逻辑可能需要做一些事情,比如断线后的数据清理,重新连接……当然,这个自然是要由逻辑层根据需求去做了。总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。
如果不主动关闭socket的话,系统不会自动关闭的,除非当前进程挂掉了,操作系统把占用的socket回收了才会关闭。为什么需要心跳连接主要是判断当前连接是否是有效的、可被使用的。在实际应用中假设一段时间没有数据传输时候理论上说应该连接是没有问题的,但是网络复杂,中途出现问题也是常见的,网线被掐断了、对方进程挂掉了、频繁丢包等,这时候TCP连接是不可使用的,但是对于应用层并不知道,如果需知道网络情况则要很复杂的超时进行了解,TCP从底层就实现了这样的功能。心跳机制是TCP在一段时间间隔后发送确认连接端是否还存在,如果存在的话就会回传一个包确定网络有效,如果心跳包有问题,则通知上层应用当前网络有问题了。
这取决于你的server端的超时配置, 每个socket连接都是长连接,它是一个相当占用系统资源的通信管道, 如果这个长连接什么事也没干硬是要占着资源,则server端可以选择关闭这个连接,以省下资源让更多的用户连接进来。更多面试讲解,微信搜索【码农编程进阶笔记】
所以,即便客户端的是采用死循环while(true)方式连到服务端,对于特定的客户端和服务端类型来说也需要一定时间间隔的心跳(告诉服务端,我还活着,虽然我没干活也没说话,但别把我关了)
03
微信支付回调失败该如何处理?
他问的是已经支付成功后,但是回调失败了。自己可以创建定时任务在每天的凌晨执行,去微信那边对账,然后更新数据库订单状态。
04
Mysql索引优化使用like时用%开头的,如何提高性能?
https://www.cnblogs.com/mqfs/p/13097229.html
05
跨域的实现原理是什么?
https://www.cnblogs.com/fundebug/p/10329202.html
06
Nginx负载均衡时如何按时间段设置?
https://blog.csdn.net/jasonware/article/details/75044944
07
秒杀活动中如何限制超买?
https://blog.csdn.net/mu_rain/article/details/80249010
08
https://blog.csdn.net/yyqhwr/article/details/106960605
09
分表时,如何在两张表中查询数据? 不用关联表的情况。Union 和 distinct的区别是什么?
参考这个 https://bbs.csdn.net/topics/90484500
-
从用途上讲:它们都具有去重的效果
-
从效率上讲:distinct通常不建议使用,效率较低;union all 和union 而言,union all效率更高;原因是:union 相当于多表查询出的数据进行去重然后再进行排序后返回,而union all是多表查询合并去重后就直接返回
-
从单表还是多表上讲:
单表上有重复记录只能使用distinct,多表查询建议用union all
10
调用区块链接口的安全措施,有那些实现方法?
-
使用MD5实现对接口加签,目的是为了防止篡改数据。
-
基于网关实现黑明单与白名单拦截
-
可以使用rsa非对称加密 公钥和私钥互换
-
如果是开放接口的话,可以采用oath2.0协议
-
使用Https协议加密传输,但是传输速度慢
-
对一些特殊字符实现过滤 防止xss、sql注入的攻击
-
定期使用第三方安全扫描插件
-
接口采用dto、do实现参数转化 ,达到敏感信息脱敏效果
-
使用token+图形验证码方法实现防止模拟请求
-
使用对ip访问实现接口的限流,对短时间内同一个请求(ip)一直访问接口 进行限制。
11
看看你的服务的访问日志,在防火墙中加过滤,或者在web服务器中加过滤吧。方法有以下几种。
-
对于特定的IP访问的情况,限制IP访问
-
限制同一IP在单位时间内的访问次数
-
上级服务器,提高吞吐能力
是消耗服务器资源为主还是纯流量攻击?消耗资源的可以通过配置防火墙过滤规则防御中小规模的攻击。如果是纯流量攻击,考虑你用的是linode真心无解。即便你封了IP封了端口也没用,人家不管你接不接受他的请求,他都会塞满你的带宽。linode必然认为你是被流量攻击或者消耗过多资源然后给你挂起。
一往期精彩回顾一
赞赏码
非学,无以致疑;非问,无以广识