富途证券后端PHP面经

两天用工作的空闲时间准备了一下,发现好久没有面试,确实比较紧张,刚好又问了许多场景的问题,一些自己刚好没有复习到的问题,也是自己实力不足,没想到一面就挂了,面试官也挺友好的,给了我建议,让我去看看<<高性能MYSQL>>这类书籍,毕竟网上的资料不全,有的分享的还是不正确的,面完我就下单买了,希望能在后面分享我学习这本书的知识,也是一种总结

整个面试30多分钟,总结了如下问题:

目录

一、浏览器输入一个地址访问的过程发生了什么

二、浏览器如何通过HTTP协议跳转到HTTPS协议(301和302的区别)

三、常见的web攻击,及防范

四、MySQL主从同步数据的底层模式,某个场景

五、如何控制两个sql语句同时执行的影响,以及解决方案,某个场景(锁和队列)

六、Redis集群模式有哪些

七、Redis队列和专业的队列有什么区别

八、如何保证一个交易接口的安全性,在运营方面(加密,IP限制白名单等等)

九、依赖注入底层怎么实现的(反射机制)

十、composer的作用(包,自动加载)

十一、自动加载规范


一、浏览器输入一个地址访问的过程发生了什么

1、浏览器进行url地址解析 

URL地址默认端口号为80,http协议,浏览器会默认补齐这些,有的还会在域名前补上www。当然完整的地址还会有用户名,密码,路径,query等等,这一步浏览器只需要解析出域名。

2、dns解析域名

这一步需要将域名换成对应的ip地址,先去查浏览器dns缓存,没有就去查系统缓存(windows的hosts文件),再没有就请求地区的dns服务器解析,再没有请求根域名服务器解析,直到获取对应域名的ip地址

3、ip寻址和arp地址转换

这一步通过ip寻址找到对应服务器,然后通过arp地址转换获取mac地址

ip协议在第三层(网络层),arp协议在第二层(数据链路层),这里涉及到OSI七层架构模型,需要好好了解一下OSI七层架构模型介绍

《TCP/IP详解 卷1 协议》

4、tcp三次握手,建立tcp连接

这一步是建立客户端和服务器之间通信的连接,首先客户端向服务器发送请求报文,标志位SYN = 1,随机seq = x,服务器收到请求报文后,发送确认报文,ack= x+1,seq = y,客户端收到确认报文后,也发送确认报文,ack = y+1,seq = z 。确认双方数据包正确则建立连接,双方进入ESTAB-LISHED状态,完成三次握手。

5、浏览器发送请求

这一步浏览器就可以封装数据成报文向服务器发送请求了,例如POST,GET等请求

7、服务器处理请求,做出响应

服务器收到请求报文,进行解析,进行程序处理然后响应对应的数据

8、浏览器收到服务器响应的数据

浏览器收到服务器的响应报文,获取到数据后进行页面渲染

二、浏览器如何通过HTTP协议跳转到HTTPS协议(301和302的区别)

通过HTTP重定向,常见的301:永久重定向,302:临时重定向

三、常见的web攻击,及防范

1、CSRF:跨站请求伪造,通过伪装成受信任用户的进行访问,用户本地存储cookie,攻击者利用用户的cookie进行认证,然后伪造用户发出请求

预防:1、不使用cookie验证,通过token令牌验证。2、通过referer识别,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。

2、XSS:跨站脚本攻击,攻击者在网页中嵌入恶意脚本程序,用户输入的数据变成了代码,比如将用户的cookie发送到攻击者服务器上

预防:将输入的数据进行转义处理,比如说讲 < 转义成<;

3、SQL注入:通过sql命令伪装成正常的http请求参数,传递到服务器端,服务器执行sql命令造成对数据库进行攻击

预防:1、SQL预处理语句。2、数据库密码进行加密存储

4、DDOS:分布式拒绝服务攻击,就是发送大量请求是使服务器瘫痪,DDos攻击是在DOS攻击基础上的,可以通俗理解,dos是单挑,而ddos是群殴,因为现代技术的发展,dos攻击的杀伤力降低,所以出现了DDOS,攻击者借助公共网络,将大数量的计算机设备联合起来,向一个或多个目标进行攻击。

预防:1、最直接的方法增加带宽。但是攻击者用各地的电脑进行攻击,他的带宽不会耗费很多钱,但对于服务器来说,带宽非常昂贵。2、云服务提供商有自己的一套完整DDoS解决方案,并且能提供丰富的带宽资源

四、MySQL主从同步数据的底层模式,某个场景

场景:主数据库执行了一条sql语句中包含了mysql时间戳函数,由于网络原因中断了10秒才同步到从数据库,此时同步到从数据库的时间是不是多了10秒,答案不是

待补充。。

这道题问的是MySQL的复制模式,有两种:基于行的复制和基于语句的复制。可以去看相关的文章补下知识。

五、如何控制两个sql语句同时执行的影响,以及解决方案,某个场景(锁和队列)

场景:一个账户上由100块钱,每次用户请求去修改账户金额之前都要查询账户金额是否够,假如有两个用户同时对账户进行了修改,MySQL如何解决这种冲突的,有什么其他的解决方案。

1、在执行修改数据之前进行加锁,提交后再释放锁

2、把查询和修改的请求放到一个队列中

这里考的是使用MySQL的锁,在项目中有没有使用过MySQL的锁。

六、Redis集群模式有哪些

  1. 主从复制
  2. 哨兵模式
  3. Redis官方 Cluster集群模式(服务端sharding)
  4. Jedis sharding集群(客户端sharding)
  5. 利用中间件代理

详细的另外去了解

七、Redis队列和专业的队列有什么区别

可靠消费

Redis:没有相应的机制保证消息的消费,当消费者消费失败的时候,消息体丢失,需要手动处理

RabbitMQ:具有消息消费确认,即使消费者消费失败,也会自动使消息体返回原队列,同时可全程持久化,保证消息体被正确消费

可靠发布

Reids:不提供,需自行实现

Redis的消息队列,如果在从队列pop出去的时候,worker处理失败的话,数据不会回到队列中,需要从业务中手动把失败的处理数据push到队列中;

RabbitMQ:具有发布确认功能,保证消息被发布到服务器

RabbitMQ有一个消息确认机制来保证消息的不丢失:客户端从队列中取出消息之后,可能需要一段时间才能处理完成,如果在这个过程中,客户端出错了,异常退出了,而数据还没有处理完成,那么非常不幸,这段数据就丢失了,因为RabbitMQ默认会把此消息标记为已完成,然后从队列中移除。

消息确认是客户端从RabbitMQ中取出消息,并处理完成之后,会发送一个ack告诉RabbitMQ,消息处理完成,当RabbitMQ收到客户端的获取消息请求之后,或标记为处理中,当再次收到ack之后,才会标记为已完成,然后从队列中删除。当RabbitMQ检测到客户端和自己断开链接之后,还没收到ack,则会重新将消息放回消息队列,交给下一个客户端处理,保证消息不丢失,也就是说,RabbitMQ给了客户端足够长的时间来做数据处理。

高可用

Redis:采用主从模式,读写分离,但是故障转移还没有非常完善的官方解决方案

RabbitMQ:集群采用磁盘、内存节点,任意单点故障都不会影响整个队列的操作

持久化

Redis:将整个Redis实例持久化到磁盘

RabbitMQ:队列,消息,都可以选择是否持久化

消费者负载均衡

Redis:不提供,需自行实现

RabbitMQ:根据消费者情况,进行消息的均衡分发

队列监控

Redis:不提供,需自行实现

RabbitMQ:后台可以监控某个队列的所有信息,(内存,磁盘,消费者,生产者,速率等)

流量控制

Redis:不提供,需自行实现

RabbitMQ:服务器过载的情况,对生产者速率会进行限制,保证服务可靠性

来自:https://blog.csdn.net/bocai_xiaodaidai/article/details/103196945

八、如何保证一个交易接口的安全性,在运营方面(加密,IP限制白名单等等)

token令牌,sign签名,数据加密,防重复提交,IP限制等等

九、依赖注入底层怎么实现的(反射机制)

这里先放一个链接 https://blog.csdn.net/weixin_42514921/article/details/113018337

后面再研究

十、composer的作用(包,自动加载)

安装扩展包,安装依赖,实现自动加载

十一、自动加载规范

psr所有规范:https://learnku.com/docs/psr

psr4自动加载规范:

  • 此处的「类」泛指所有的「Class类」、「接口」、「traits 可复用代码块」以及其它类似结构。

  • 一个完整的类名需具有以下结构:

     \<命名空间>(\<子命名空间>)*\<类名>
    
    1. 完整的类名 必须 要有一个顶级命名空间,被称为 "vendor namespace";

    2. 完整的类名 可以 有一个或多个子命名空间;

    3. 完整的类名 必须 有一个最终的类名;

    4. 完整的类名中任意一部分中的下滑线都是没有特殊含义的;

    5. 完整的类名 可以 由任意大小写字母组成;

    6. 所有类名都 必须 是大小写敏感的。

  • 当根据完整的类名载入相应的文件

    1. 完整的类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,作为「命名空间前缀」,其必须与至少一个「文件基目录」相对应;

    2. 紧接命名空间前缀后的子命名空间 必须 与相应的「文件基目录」相匹配,其中的命名空间分隔符将作为目录分隔符。

    3. 末尾的类名 必须 与对应的以 .php 为后缀的文件同名。

    4. 自动加载器(autoloader)的实现 一定不可 抛出异常、一定不可 触发任一级别的错误信息以及 不应该 有返回值。

看来每天都要不停地学习和复习啊。。。

你可能感兴趣的:(面试经历,面试题,php,mysql,队列,面试)