github:
文章底部有【技术社群&福利】,不定更新活动、源码,欢迎来撩~~~
今日主题:22年考虑了一下后续公号技术文章的风格&技术内容,思考如何更好有效帮助到关注我的各位铁友们;后续的文章思考方式会不同,会考虑每一篇的价值。
既然又到了面试的季节,那么面试前准备的资料这是必不可少。这项资料必须得掌握住了。
今天分享一波22年php面试问题,答案不会写的那么详细,如有需要可以自查。
文章内容全部梳理最新面试的一个总结。
2022年 php面试之60题
1、什么变量是存储在堆/栈?
A:基本类型保存在栈中,引用类型保存到堆(细节自查)
2、PHP中HashMap的结构是如何实现?
A:HashMap是数组结构、链表结构与Hash算法的结合(细节自查)
3、如何解决PHP内存溢出问题?
A:1)增加内存大小;2)销毁变量释放内存。(细节自查)
注意事项:unset 函数只能在变量值占用内存空间超过256字节时才会释放内存空间。
4、PHP的字符串为什么是二进制安全的?
A:ascii字符(细节自查)
5、PHP的内存回收机制?
A:5.3版本新的内存回收机制的出现,机制的三个基本规则:
1)如果一个zval容器的refcount增加,说明有新的变量(符号)指向这个容器,那么这个容器当然不会是垃圾,它将被继续使用。
2)如果一个zval容器的refcount减少到0了,那么说明没有变量(符号)指向这个容器,它就会被php引擎销毁。
3)如果一个zval容易的refcount减少了,但是不是0,那么这个容器就有可能是垃圾,就会被垃圾回收机制所管理。
6、PHP7中对zVal做了哪些修改?
A:1)refcount的存放换了个位置,从zval全局换到了zend.value自身中。优点在于能更快的来做+1-1的操作;
2)字节数减少了;
3)PHP7把部分变量(局部变量,对象的键名)存放在栈中;
4)PHP7标量数据类型(布尔,整形,字符串,浮点型)不再计数,不需要单独分配内存。
7、设计模式场景及介绍
A:工厂模式、建造者模式、单例模式、策略模式(细节自查)
8、php的反射
A:反射 API 提供了方法来取出函数、类和方法中的文档注释。(细节自查)
9、自动加载实现方式
A:自动加载的原理以及__autoload的使用(细节自查)
10、PHP中创建多进程有哪些方式?
A:pcntl_fork(子进程) — 在当前进程当前位置产生分支。(细节自查)
11、Swoole 服务端启动后有哪些进程,完成什么工作?
A:启动的这个服务使用了 8 个进程、2 个线程;(细节自查)
16389 是 Master 进程。
16390 是 Manager 进程。
16391、16392 是 Reactor 线程。
16393、16394、16395、16396、16397、16398 包括 3 个 Worker 进程,3 个 Task 进程。
12、MySQL的查询需要遍历几次B+树,理论上需要几次磁盘I/O?
A:主键索引从上至下遍历一次B+树,二级索引需要遍历两次B+树(细节自查)
13、sql语句执行过程
A:连接器-》查询缓存-〉分析器-》优化器-〉执行器
14、字段为varchar类型,where num=111 能否用到索引
A:表中字段为字符类型的时候,查询的值为整型时,无法走索引;
15、mysql索引失效情况
A:like 以%开头,索引无效;组合索引,不是使用第一列索引,索引失效;当or左右查询字段只有一个是索引,该索引失效(细节自查)
16、mysql回表
A:回表就是通过辅助索引拿到主键id之后,要再去遍历聚集索引的B+树,这个过程就是回表
17、事务隔离级别
A:4个级别,未提交读(Read Uncommitted)、提交读(Read Committed)、可重复读(Repeated Read)、序列化(Serializable
18、mysql 集群的几种方式
A:LVS+Keepalived+MySQL ,目前很多种,建议使用这种,相对案例多,坑少(细节自查)
19、聚簇索引和非聚簇索引的区别
A:聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。具体细节依赖于其实现方式。(细节自查)
20、事务的特性
A:ACID(细节自查)
21、mysql查询慢原因,优化建议
A:1)查询慢 (细节自查):
1-1 :没有用到索引;
1-2:I/O吞吐量小,形成了瓶颈效应
1-3:网络速度慢
1-4:查询出的数据量过大
1-5:出现死锁
2)优化建议(细节自查):
2-1: 把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要
2-2:纵向、横向分割表,减少表的尺寸(sp_spaceuse)
2-3:提升网速
2-4:增加服务器CPU个数
22、事务a嵌套事务b,会发生什么
A:rollback回滚无效(细节自查)
23、redis数据类型哪些?你用于的业务场景是?
A:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
24、redis的IO模型
A:基于多路复用(事件轮询)、非阻塞。(细节自查)
25、redis的协议
A:RESP (REdis Serialization Protocol)协议进行通讯
26、redis的管道
A:Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。(细节自查)
27、持久化策略哪些?怎么实现的持久化?
A:rdb、aof ,自动执行&手动执行(细节自查)
28、淘汰策略
A:1)当内存不足以容纳新写入数据时,新写入操作会报错。
2)当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。
3)当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
4)当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。(细节自查)
29、rabbitmq 如何保证消息不丢失
A:1)消息持久化;2)ACK确认机制;3)设置集群镜像模式;4)消息补偿机制(细节自查)
30、rabbitmq 如何保证消息的顺序性
A: 搞3个Queue,每个消费者就消费其中的一个Queue。把需要保证顺序的数据发到1个Queue里去。
31、rabbitmq 的心跳丢失
A:分布式的tcp连接采取适中的时间(比如Linux默认配置大约11分钟),方便操作系统检测。
32、Nginx中root和alias的区别
A:1)使用alias时,目录名后面一定要加"/"。2)alias可以指定任何名称。
33、Nginx正向代理和反向代理
A:1)正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
2)反向代理实际运行方式是代理服务器接受网络上的连接请求。它将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给网络上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
可以这么认为,对于正向代理,代理服务器和客户端处于同一个局域网内;而反向代理,代理服务器和源站则处于同一个局域网内。
34、nginx负载均衡的5种策略
A:轮询(默认)、指定权重、IP绑定 ip_hash、fair(第三方)、url_hash(第三方)
35、nginx怎么实现反向代理用做内网域名转发
A:指定内网ip+端口(细节自查)
36、PHP中密码加密,使用什么方式加密?
A:MD5加密、Crype加密、Sha1加密、URL加密
37、对称加密和非对称加密
A:对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。
38、mysql存储引擎 有哪些?区别点?
A:InnoDB、MyISAM、MERGE、ARCHIVE、CSV、BLACKHOLE
39、mysql使用行锁的条件
A:主键索引需要加一把锁,使用二级索引需要在二级索引和主键索引上各加一把锁(细节自查)
40、sql优化点
A:数据库方面、sql 语句方面(细节自查)
41、MVCC 介绍
A:MVCC是一种多版本并发控制机制。(细节自查)
42、分布式锁 介绍
A:根据redis缓存实现 分布式锁 - Setnx(细节自查)
43、fast-cgi,cgi 是什么?
A:CGI是为了保证web server传递过来的数据是标准格式的,Fastcgi是用来提高CGI程序性能的。
44、http 状态码,1、2、3、4、5 开头分别代表什么?
A:
1 开头:这一类型的状态码,代表请求已被接受,需要继续处理.这类响应是临时响应,使包含状态码行和某些可选的响应头信息,并以空行结束.
2 开头:的状态码,请求以成功被接受,理解
3 开头:需要用户端采取进一步的操作才能完成请求.通常,这些状态码用来重定向,后续的请求地址在本,次响应的location域中指明.
4 开头:语义有误,当前请求无法被服务器理解,除非进行修改,否则客服端不应该重复提交这个请求.
5 开头:代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以的软硬件资源无法完成对请求的处理,除非这是一个HEAD请求,是服务器应当包含一个解释当前错误状态以及这个善是临时的还是永久的解释 信息实体.浏览器应当向用户展示任何在当前响应中被被包含的实体
45、mysql主从延迟解决方案
A:主库针对写操作,顺序写binlog,从库单线程去主库顺序读”写操作的binlog”,从库取到binlog在本地原样执行(随机写),来保证主从数据逻辑上一致
46、redis缓存击穿、缓存穿透
A:缓存穿透:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
缓存击穿:key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
47、熔断 介绍
A:“熔断”就是为了避免”雪崩”而生的,它的思路是在调用方增加一种”避让”机制,当下游出现异常时能够停止(熔断)对下游的继续请求,当等待一段时间后缓慢放行部分的调用流量,并当这部分流量依旧正常的情况下,彻底解除”熔断”状态。
48、三次握手
A:第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的syn(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
49、一次完整的http 请求过程
A:1. 用户在浏览器地址栏中输入网站域名
2. 浏览器拿到该域名自动去请求 DNS服务器查询 用户输入的域名对应的 ip 地址
3. 浏览器拿到 ip 地址之后,通过ip地址+端口号(HTTP默认80)和服务器建立连接(通过 三次握手 )
4. 三次握手建立连接成功之后
5. 浏览器将用户输入的 url 地址通过 HTTP 协议包装成 请求报文 ,然后通过 Socket(服务器ip地址和端口号) 发送到服务器
6. 当HTTP服务器接收到客户端浏览器发送过来的请求报文时候,按照 HTTP 协议将请求报文解析出来
7. 然后服务器拿到请求报文中的请求信息(例如请求路径url),做相应的业务逻辑处理操作
8. 当业务逻辑处理完毕之后,服务器将要发送给客户端的数据按照 HTTP 协议包装成 响应报文
9. 然后服务器通过 Socket(客户端的ip地址+端口号) 将响应报文数据发送给客户端浏览器
10. 当浏览器接收到服务器发送给自己的响应报文数据的时候,浏览器根据 HTTP 协议将报文内容解析出来
11. 浏览器拿到响应报文体中的数据开始 解析渲染html、css,执行 JavaScript
12. 如果在解析的过程(从上到下)中,发现有外链的标签(link、css、img)
13. 浏览器会自动对该标签指向的 路径地址 发起新的请求(还是通过 Socket )。
50、Session 共享
A:基于Cookie的Session共享、基于数据库的Session共享
51、InnoDB引擎的4大特性有哪些
A:插入缓冲、二次写、自适应哈希、预读
52、非聚簇索引一定会回表查询吗?
A:不一定,这涉及到查询语句所要求的字段是否全部命中了索引,如果全部命中了索引,那么不需要进行回表查询。
53、mysql 碎片是如何产生的?如何解决?
A:物理删除数据导致,数据也占用一定物理空间,解决方式根据存储引擎,写法也是不同
54、数据库的乐观锁和悲观锁
A:悲观锁,是因为这是一种对数据的修改抱有悲观态度的并发控制方式。我们一般认为数据被并发修改的概率比较大,所以需要在修改之前先加锁。
悲观并发控制实际上是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。
相对于悲观锁,在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本。
乐观并发控制相信事务之间的数据竞争(data race)的概率是比较小的,因此尽可能直接做下去,直到提交的时候才去锁定,所以不会产生任何锁和死锁。
55、mongo 的业务场景,常用语法
A:1)应用服务器的日志记录、2)第三方信息的抓取与存储、3)运维监控系统
56、explain的用法
A:EXPLAIN +SQL语句
57、依赖注入 和 控制反转
A: Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
58、PHP8的新特性
A:命名参数、注解语法、构造函数参数改进、联合类型、匹配表达、空安全运算符、字符串和数字比较、函数内部一致性校验错误(细节自查)
59、分库分表过程
A:1)确认分库分表键;2)分片算法;3)确定容量,考虑扩容;4)唯一id;5)
单库表 迁移 到分库;6)分库分表中间件(细节自查)
60、php 数组的底层实现
A:存储元素数组、散列函数(细节自查)
分割线
为了让各位方便:交流、交友、技术视频、资源分享、接私活 等等,可以扫下面二维码(:xzzs730),备注 “ 技术 ” 就可以通过审核。
进群的小伙伴请加右侧私人(备注:技术)-----商务合作分隔线----商务合作,关注回复“商务合作”