2020最新大厂内部 PHP 高级工程师面试题汇总(一)
2020最新大厂内部 PHP 高级工程师面试题汇总(二)
81、a 引用 b,报错 c 里面类重复定义,循环引用会出现什么问题
82、下面员工 3 的薪水大于其主管的薪水,一条 SQL 找到薪水比下属低的主管
id | username | salary | pid |
---|---|---|---|
1 | a | 3000 | null |
2 | b | 8000 | null |
3 | c | 5000 | 1 |
4 | d | 6000 | 3 |
SELECT a.*, b.*
FROM `user` as a
LEFT JOIN `user` as b ON a.pid = b.id AND a.salary > b.salary
WHERE b.id > 0;
82、在一个坐标系内有一个 N 个点组成的多边形,现在有一个坐标点,写代码或思路来判断这个点是否处于多边形内
83、数据库如果出现了死锁,你怎么排查,怎么判断出现了死锁?
84、写一个一个程序来查找最长子串
85、分析一个问题:php-fpm 的日志正常,但客户端却超时了,你认为可能是哪里出了问题,怎么排查?
检查 nginx log,请求是否达到 nginx 和是否正常转发给 php-fpm
86、nginx 的工作流程是什么样的,可以画图描述
87、进程间通信方式有哪些
- 管道
管道分为有名管道和无名管道
无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系一般指的是父子关系。无名管道一般用于两个不同进程之间的通信。当一个进程创建了一个管道,并调用 fork 创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样提供了两个进程之间数据流动的一种方式。
有名管道也是一种半双工的通信方式,但是它允许无亲缘关系进程间的通信。
- 信号量
信号量是一个计数器,可以用来控制多个线程对共享资源的访问., 它不是用于交换大批数据,而用于多线程之间的同步。它常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源。因此,主要作为进程间以及同一个进程内不同线程之间的同步手段.
- 信号
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生.
- 消息队列
消息队列是消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点。消息队列是 UNIX 下不同进程之间可实现共享资源的一种机制,UNIX 允许不同进程将格式化的数据流以消息队列形式发送给任意进程。对消息队列具有操作权限的进程都可以使用 msget 完成对消息队列的操作控制。通过使用消息类型,进程可以按任何顺序读信息,或为消息安排优先级顺序.
- 共享内存
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC (进程间通信) 方式,它是针对其它进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步与通信.
- 套接字:可用于不同及其间的进程通信
88、主从复制,从服务器会读取到主服务器正在回滚的数据吗?主数据库写成功,从服务器因为一些原因写失败,最后会出现什么情况?主从复制如果键冲突怎么办?
不会;主从数据不一致;正常是不会出现这种情景,具体看情况,是否可以修复,恢复到之前的时间点,然后追回同步。
89、事务有几种隔离级别?事务的隔离级别是怎么实现的?
- 读未提交(read-uncommitted)
- 不可重复读(read-committed)
- 可重复读(repeatable-read)
- 串行化(serializable)
90、什么是 B + 树,请画 b + 树的结构
91、mysql 中的字符集,客户端与数据库不一致,怎么办?MYSQL 中字符串到显示到界面,字符转换的过程是怎样的?数据库中的字符集是 latin1, 你现在将 utf8 的字符串存到 latin1 字符集的数据库表,你能将 utf8 的字符串存进去吗?假如你说能存,追问:能否恢复?假如能,那怎么恢复?
92、写一段代码,找到所有子集合,如 [a,b,c] 的子集合有 {},{a},{b},{c},{ab},{ac},{abc}
93、['a'=>200,'b'=>100,'c'=>100], 写一个自定义排序函数,按值降序,如果值一样,按键排序
冒泡排序
94、设计一个缓存系统,可以定期或空间占满之后自动删除长期不用的数据,不能使用用遍历。
我当时的答案是用链表来存,缓存命中就将该缓存移到链表头,然后链表尾就都是冷数据了。
我记得之前是在哪里看过这个设计,但我忘记在连接了,请知道朋友的把连接贴上来。
95、== 和 === 的区别,写出以下输出:"aa"==1,"bb"==0,1=="1"
- == 等于,不需要对比数据类型
- === 全等,需要对比类型
false, true, true
96、一个排序好的数组,将它从中间任意一个位置切分成两个数组,然后交换它们的位置并合并,合并后新数组元素如:20,21,22,25,30,1,2,3,5,6,7,8,15,18,19, 写一个查询函数来查找某个值是否存在。
97、设计一个树形结构,再写一个函数对它进行层序遍历
98、'var" 的区别
双引号串中的内容可以被解释而且替换,而单引号串中的内容总被认为是普通字符。
在单引号串中甚至反斜杠也失去了他的扩展含义(除了插入反斜杠 \ 和插入单引号 ')。所以,当你想在字串中进行变量代换和包 含 \n(换行符)等转义序列时,你应该使用双引号。单引号串可以用在其他任何地方,脚本中使用单引号串处理速度会更快些。
99、self 和 static 的区别
static:如果在子类中重写了父类中的 static 方法、属性,父类就会去访问了子类的 static 方法
self: 是类内指针,不管子类有没有重写过父类中的方法、属性都指向本类的静态方法、属性
100、PHP 的协程以及用途
101、描述 autoload 的机制
102、mysql 中字段类型各占几个字节:smallint、int、bigint、datetime、varchar (8)
- smallint 2 字节
- int 4 字节
- bigint 8 字节
- datetime 8 字节
- varchar (8) 8*3 字节
103、哪些属性唯一确定一条 TCP 连接
104、myisam 和 innodb 的区别,为什么 myisam 比 innodb 快,myisam 和 innodb 的索引数据结构是什么样的?innodb 主键索引和非主键索引的区别?其索引上存放的数据是什么样的?
区别主要在数据和索引的存储结构和存储方式上,以及对于事务的支持。
105、断开 TCP 连接时,timewait 状态会出现在发起分手的一端还是被分手的一端
为什么建立 TCP 连接需要三次握手?
原因:为了应对网络中存在的延迟的重复数组的问题
例子:
假设 client 发起连接的连接请求报文段在网络中没有丢失,而是在某个网络节点长时间滞留了,导致延迟到达 server。本来这是一个已经失效的连接报文,但是 server 接收到这个连接报文之后,误认为 client 发起了新的连接,于是向 client 发送确认报文段。此时因为没有了连接的 3 次握手,client 不会对 server 的确认报文作出回应,也不会向 server 发送数据,server 就以为连接已经建立,一直在空等 client 的数据,这样 server 的这一部分网络资源就被浪费了。
为什么断开 TCP 连接需要进行四次握手 ?
因为 TCP 连接是全双工的网络协议,允许同时通信的双方同时进行数据的收发,同样也允许收发两个方向的连接被独立关闭,以避免 client 数据发送完毕,向 server 发送 FIN 关闭连接,而 server 还有发送到 client 的数据没有发送完毕的情况。所以关闭 TCP 连接需要进行四次握手,每次关闭一个方向上的连接需要 FIN 和 ACK 两次握手。
TIME_WAIT 状态的意义
在 TCP 连接中,当被动关闭连接的一方 (图中 client) 发送的 FIN 报文到达时,被动关闭连接的一方会发送 ACK 确认报文,并且进入 TIME_WAIT 状态,并且等待 2MSL 时间段 (MSL:maximum segment life)。这么做有下述两个原因:
被动关闭连接的一方 (图中的 server) 在一段时间内没有收到对方的 ACK 确认数据包,会重新发送 FIN 数据包,因而主动关闭连接的一方需要停留在等待状态以处理对方重新发送的 FIN 数据包。否则他会回应一个 RST 数据包给被动关闭连接的一方,使得对方莫名其妙。
在 TIME_WAIT 状态下,不允许应用程序在当前 ip 和端口上和之前通信的 client (这个 client 的 ip 和端口号不变) 建立一个新的连接。这样就能避免新的连接收到之前的 ip 和端口一致的连接残存在网络中的数据包。这也是 TIME_WAIT 状态的等待时间被设置为 2MSL 的原因,以确保网络上当前连接两个方向上尚未接收的 TCP 报文已经全部消失。
106、AWK 各种数据分析考得非常多,要多练习,题目不再一一写了
107、redis 中集合、有序集合、hyperLog、hash 的数据结构是啥样的
key value
108、描述一下:一个请求到达 nginx 的全部处理过程(nginx 自身会调用哪些逻辑)、然后怎么与 php 通信,中间的流程是什么样的等等?
109、nginx 和 php-fpm 的相关配置,随便问里面各种参数啥意思
php-fpm 可以通过 tcp socket 和 unix socket 两种方式实现。
110、假如有一张地图,如下图,"-" 代表海洋、"+" 代表陆地,用你最擅长的方式,取出陆地的坐标。
--++----++--+++---
-++++----+++++++--
-+++----++++------
-----++------++++-
---++++++-----+++-
-----+++------+++-
比如上图在数组中表示成,1 表示成陆地,0 表示海洋:
[
[0,0,1,1,0,0,0,1,1....],
[0,1,1,1.....],
]
写个算法取出所有陆地的坐标,并按块放到一起,如地图上左上角第一个陆地的坐标是:
[
[0,2],[0,3],
[1,1],[1,2],[1,3],[1,4],
[2,1],[2,2],[2,3]
]
111、Jsonp 的实现原理,你还知道哪些跨域方式?
- JSONP
- 添加响应头,允许跨域
- 代理的方式
112、如果某个博客通过判断 referer 方式来进行图片防盗链,如何破解?
curl 设置来源地址来欺骗对方服务器验证
113、简述 mysql 查询优化的本质,并举 2 个例子
114、设计一个秒杀系统,如何保证商品不超卖?
115、单例模式的优点是什么?抽象类是什么? 还了解哪些设计模式?
单例模式又称为职责模式,它用来在程序中创建一个单一功能的访问点,通俗地说就是实例化出来的对象是唯一的。
所有的单例模式至少拥有以下三种公共元素:
- 它们必须拥有一个构造函数,并且必须被标记为 private
- 它们拥有一个保存类的实例的静态成员变量
- 它们拥有一个访问这个实例的公共的静态方法
单例类不能再其它类中直接实例化,只能被其自身实例化。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
- 工厂模式
- 适配器模式
更多学习内容可以访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新)
以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的PHP技术交流群953224940