php常见面试题总结

本文详细总结了PHP面试中的常见问题,涵盖了Nginx工作原理、PHP-FPM与Swoole的比较、PHP7性能提升的原因、MySQL主从同步机制、订单处理策略、接口安全措施、消息队列的作用、HTTP协议与TCP/IP的关系、PHP垃圾回收机制、MySQL索引覆盖等关键知识点。此外,还讨论了PHP与其他技术如Redis、Laravel框架、HTTP状态码、数据库设计等方面的内容,是准备PHP面试的全面参考资料。
摘要由CSDN通过智能技术生成

1、nginx 的工作原理
Nginx 由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅
通过查找配置文件将客户端请求映射到一个 location block(location 是 Nginx 配置中
的一个指令,用于 URL 匹配),而在这个 location 中所配置的每个指令将会启动不同的模块
去完成相应的工作。

2、PHP-FPM
Master 主进程 / Worker 多进程模式。
启动 Master,通过 FastCGI 协议监听来自 Nginx 传输的请求。
每个 Worker 进程只对应一个连接,用于执行完整的 PHP 代码。
PHP 代码执行完毕,占用的内存会全部销毁,下一次请求需要重新再进行初始化等各种繁琐的操作。
只用于 HTTP Server。
Swoole
Master 主进程(由多个 Reactor 线程组成)/ Worker 多进程(或多线程)模式
启动 Master,初始化 PHP 代码,由 Reactor 监听 Socket 句柄的事件变化。
Reactor 主线程负责子多线程的均衡问题,Manager 进程管理 Worker 多进程,包括 TaskWorker 的进程。
每个 Worker 接受来自 Reactor 的请求,只需要执行回调函数部分的 PHP 代码。
只在 Master 启动时执行一遍 PHP 初始化代码,Master 进入监听状态,并不会结束进程。
不仅可以用于 HTTP Server,还可以建立 TCP 连接、WebSocket 连接。

3、为什么 PHP7 比 PHP5 性能提升了?

1、变量存储字节减小,减少内存占用,提升变量操作速度

2、改善数组结构,数组元素和hash映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率

3、改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率

3、mysql主从的同步原理是什么?
当主数据服务器master进行写入数据或者更新数据操作的时候,数据更改会记录在二进制日志(binary log file)中,主服务器master与从服务器slave进行通讯的是I/O线程,它将修改的数据异步复制写入到slave服务器的中继日志(relay log file)中,从服务器slave与中继日志之间通信使用SQL线程,SQL线程可以异步从中继日志中读取数据后再写入到自己的数据库中,就完成了数据的主从同步功能。
主要:二进制日志
细节体现:
为什么有主从延迟:
1. Master负载过高、

		Slave负载过高、
	2.网络延迟、
	
	机器性能太低、
	MySQL配置不合理
3.怎么预防主从延迟:
	缓存

4.订单为什么要拆单?如果拆单依据是什么?
因为考虑一个用户购买多个商品,多个商品属于多个商家。多个商家要发货,并且分钱。所以拆单
1.按照店铺拆分
2.按照商品类型拆分
如果拆单表设计如何设计?

5什么情况下使用不了索引
1.复合索引:不遵循最左原则
2.模糊查询 “%k”
3.如果mysql认为全表扫面要比使用索引快,则不使用索引。
4.有逻辑运算符2+2
5.如果条件中有 or, 有条件没有使用索引,即使其中有条件带索引也不会使用,换言之, 就是要求使用的所有字段,都必须单独使用时能使用索引。
6.如果列类型是字符串,那么一定要在条件中使用引号引用起来,否则不使用索引。

6.laravel和tp的区别

1.Laravel 在表单提交的时候会有csrf 跨站请求伪造验证,Tp5则没有
2.Laravel 在请求需要先定义路由,Tp5可以不定义,有pathinfo路由即可访问
3.Laravel 在请求之前会有中间件, Tp5会有前置操作和钩子

7.http和https区别
https数据加密 ===非对称加密
http明文传输

8.接口安全如何处理
1.访问
防刷
存储ip地址
accessToken
2.数据
一个传输过程中
http https
数据本身加密
对称加密
有一个秘钥
非对称加密
公钥
私钥

9.redis和memcache区别
1.数据类型
redis:字符串,hash,队列,有序集合,集合 memcache:字符串
2.存储方式
memcache:内存存储不支持持久化 redis:支持持久化
3.内存管理
redis:直接管理空间 memcache:将内存空间切割成大小不同的空间,按照存储数据的大小进程存储

10.如何理解雪崩,缓存穿透
缓存穿透:在缓存里面有数据,但是查询不到。所以读取数据库。
缓存穿透
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。

解决方案
有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。另外也有一个更为简单粗暴的方法(我们采用的就是这种),如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

缓存雪崩
缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。

解决方案
缓存失效时的雪崩效应对底层系统的冲击非常可怕。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线 程(进程)写,从而避免失效时大量的并发请求落到底层存储系统上。这里分享一个简单方案就时讲缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

11.反向代理主调度器挂掉如何处理
热备开启

12.http和websocket的区别
WebSocket是HTML5中的协议,支持持久连接;而Http协议不支持持久连接

13、¥this与$self的区别
1.self可以访问本类中的静态属性和静态方法,可以访问父类中的静态属性和静态方法。用self时,可以不用实例化的

1.this可以调用本类中的方法和属性,也可以调用父类中的可以调的方法和属性,可以说除过静态和const常量,基本上其他都可以使

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值