2021年12月PHP面试题总结

码农编程进阶笔记

共 3031字,需浏览 7分钟

 · 2021-12-09

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

  1. 从用途上讲它们都具有去重的效果

  2. 从效率上讲:distinct通常不建议使用,效率较低;union all 和union 而言,union all效率更高;原因是:union 相当于多表查询出的数据进行去重然后再进行排序后返回,而union all是多表查询合并去重后就直接返回

  3. 从单表还是多表上讲:

  单表上有重复记录只能使用distinct,多表查询建议用union all


10

调用区块链接口的安全措施,有那些实现方法?

  1. 使用MD5实现对接口加签,目的是为了防止篡改数据。

  2. 基于网关实现黑明单与白名单拦截

  3. 可以使用rsa非对称加密 公钥和私钥互换

  4. 如果是开放接口的话,可以采用oath2.0协议

  5. 使用Https协议加密传输,但是传输速度慢

  6. 对一些特殊字符实现过滤 防止xss、sql注入的攻击

  7. 定期使用第三方安全扫描插件

  8. 接口采用dto、do实现参数转化 ,达到敏感信息脱敏效果

  9. 使用token+图形验证码方法实现防止模拟请求

  10. 使用对ip访问实现接口的限流,对短时间内同一个请求(ip)一直访问接口 进行限制。


11

 服务器受到dos攻击,这个问题如何应付?

看看你的服务的访问日志,在防火墙中加过滤,或者在web服务器中加过滤吧。方法有以下几种。
  1. 对于特定的IP访问的情况,限制IP访问
  2. 限制同一IP在单位时间内的访问次数
  3. 上级服务器,提高吞吐能力
是消耗服务器资源为主还是纯流量攻击?消耗资源的可以通过配置防火墙过滤规则防御中小规模的攻击。如果是纯流量攻击,考虑你用的是linode真心无解。即便你封了IP封了端口也没用,人家不管你接不接受他的请求,他都会塞满你的带宽。linode必然认为你是被流量攻击或者消耗过多资源然后给你挂起。

一往期精彩回顾

[精选]PHP高级开发工程面试经整理

2021年最新大厂php+go面试题集(一)

2021年最新大厂php+go面试题集(二)

2021年最新大厂php+go面试题集(三)

2021年最新大厂php+go面试题集(四)

php程序员面试题(偏中级面试题)

面试官问:如何防超卖,有几种实现方式[精选]

PHP高级开发工程面试经整理

稳了!学会这些PHP面试题成功拿下offe

浅谈面试经验(面试官角度)

go面试题:第一天

盘点2021年PHP开发工程师遇到的面试题

2021 年6月面试遭遇滑铁卢,现在这么内卷了吗

想跳槽涨薪,想进大厂,如何准备面试呢?

浏览 28
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报