2020最新内部PHP高级工程师面试题汇总(一)2020最新大厂内部PHP高级工程师面试题汇总(二)81、a引b、c中的类被重复定义,循环引用会怎样?JOIN`user`asbONa.pid=b.idANDa.salary>b.salaryWHEREb.id>0;82.在一个坐标系中有一个由N个点组成的多边形,现在有一个坐标点,写代码或者思路判断这个点是否在多边形内83.如果数据库出现死锁,怎么查并判断是否存在死锁?84.写一个程序求最长子串85.分析一个问题:php-fpm的日志正常,但是客户端超时。您认为可能存在问题,如何排除故障?查看nginx日志,请求是否正常到达nginx并转发到php-fpm。nginx的工作流程是怎样的?可以画图来描述87.进程间的通信方式有哪些?1)管道分为命名管道和无名管道。它是一种半双工通信方式,数据只能单向流动,只能在有亲缘关系的进程之间使用。进程亲和性一般是指父子关系。无名管道一般用于两个不同进程之间的通信。当进程创建管道并调用fork创建自己的子进程时,父进程关闭读管道端,子进程关闭写管道端,为两个进程之间的数据流通提供了途径。众所周知的管道也是一种半双工的通信方式,但是它允许不相关的进程之间进行通信。2)信号量信号量是一个计数器,可以用来控制多个线程对共享资源的访问。它不用于交换大量数据,而是用于多个线程之间的同步。它通常用作一种锁定机制,以防止其他进程在一个进程访问资源时访问该资源。因此,它主要用作进程之间以及同一进程中不同线程之间的同步手段。3)Signal信号是一种比较复杂的通信方式,用于通知接收进程有事件发生。4)消息队列消息队列是一个消息链表,存储在内核中,由消息队列标识符标识。消息队列克服了信号传输信息少,管道只能承载无格式字节流,缓冲区大小有限等特点。消息队列是UNIX下不同进程间共享资源的一种机制。UNIX允许不同的进程以消息队列的形式向任意进程发送格式化的数据流。对消息队列有操作权限的进程可以使用msget完成对消息队列的操作控制。通过使用消息类型,进程可以按任意顺序读取信息,或者为消息安排优先顺序。5)共享内存共享内存就是映射一段内存,可以被其他进程访问。此共享内存由一个进程创建,但任何进程都可以访问多个。共享内存是最快的IPC(Inter-ProcessCommunication)方式,它是专门为避免其他进程间通信方式的低效而设计的。它常与信号量等其他通信机制结合使用,以实现进程间的同步和通信。6)sockets:可用于不同进程之间的通信88、主从复制,从服务器会读取主服务器回滚的数据吗?主库写入成功,但是从服务器由于某些原因写入失败。最后会发生什么?主从复制key冲突怎么办?不;主从数据不一致;一般不会出现这种情况,看情况能不能修复,恢复到之前的时间点,然后恢复同步。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],写自定义排序函数,按值降序,如果值相同,按key冒泡排序排序94,设计一个缓存系统,可以自动删除周期性或空间满后长期不用的数据,不能使用遍历。我当时的回答是用链表来存储。如果缓存命中,则将缓存移动到链表的头部,然后链表的尾部为冷数据。我记得以前在哪里看到过这个设计,但是忘记连接了,请知道的朋友告诉我并贴出链接。95.==和===的区别,写出如下输出:"aa"==1,"bb"==0,1=="1"==相等,不用比较数据类型===congruent,需要比较类型false,true,true96,一个排序数组,从中间任意位置拆分成两个数组,然后交换位置合并。合并后新的数组元素如下:20,21,22,25,30,1,2,3,5,6,7,8,15,18,19价值存在。97.设计一个树结构,然后写一个函数来分层遍历它。98.'$var'和"$var"的区别双引号字符串中的内容可以被解释和替换,而单引号字符串中的内容总是被认为是普通字符。甚至反斜杠在单引号字符串中也失去了它的扩展意义(插入反斜杠和插入单引号'除外)。因此,当要进行变量替换且字符串中包含n(换行符)等转义序列时,应使用双引号。其他任何地方都可以使用单引号字符串,脚本中单引号字符串的处理速度会更快。99.self和staticstatic的区别:如果在子类中重写了父类中的static方法和属性,那么父类会访问子类的static方法self:是类中的一个指针,不管是否是子类有没有父类中Overrided的方法和属性都指向本类的静态方法,属性100,PHP协程和使用101,autoload机制说明102,mysql中字段类型各占几个字节:smallint,int,bigint,datetime,varchar(8)smallint2bytesint4bytesbigint8bytesdatetime8bytesvarchar(8)8*3bytes103、哪些属性唯一确定一个TCP连接104、myisam和innodb的区别,为什么myisam比innodb快吗,myisam和innodb的索引数据结构是什么?innodb主键索引和非主键索引有什么区别?索引上存储的数据是什么样的?区别主要在于数据和索引的存储结构和存储方式,以及对事务的支持。105、当TCP连接断开时,timewait状态会出现在发起断开的一端还是被断开的一端?为什么建立TCP连接需要握手三次?原因:为了处理网络延迟重复数组的问题。示例:假设客户端发起的连接请求报文段并没有在网络中丢失,而是长时间停留在某个网络节点,导致延迟到达服务器。本来这是一条无效的连接报文,但是服务器收到连接报文后,误认为客户端发起了新的连接,于是向客户端发送了一个确认报文段。此时由于连接没有3次握手,客户端不会响应服务器的确认报文,也不会向服务器发送数据。服务器认为连接已经建立,一直等待客户端的数据。浪费了一些网络资源。为什么断开TCP连接需要四次握手?因为TCP连接是全双工网络协议,它允许双方同时通信同时发送和接收数据,也允许发送和接收两个方向的连接独立关闭,以免客户端数据发送完后向服务器发送FIN关闭连接,还有服务器发送给客户端的数据还没发送完的情况。因此,关闭一个TCP连接需要四次握手,关闭一个方向的连接需要FIN和ACK的两次握手。TIME_WAIT状态的含义在一个TCP连接中,当被动关闭连接的一方(图中client)发送的FIN报文到达时,被动关闭连接的一方会发送ACK确认报文,进入TIME_WAIT状态,并等待2MSL时间段(MSL:maximumsegmentlife)。这有两个原因:被动关闭连接的一方(图中服务器)一段时间内没有收到对方的ACK确认包,会重发FIN数据包,所以关闭的一方主动关闭连接需要保持Wait状态来处理对方重发的FIN包。否则,他会回复一个RST包给被动关闭连接的一方,让对方莫名其妙。在TIME_WAIT状态下,不允许应用程序在当前ip和端口上与之前通信的客户端(客户端的ip和端口号不变)建立新的连接。这样新的连接就可以避免接收到上一个相同ip和端口的连接留在网络中的数据包。这就是为什么将TIME_WAIT状态的等待时间设置为2MSL,以确保网络上当前连接的两个方向上所有未收到的TCP数据包都已经消失。106、AWK数据分析测试较多,需要多加练习。题目就不再一一写了。107、redis中set、orderedset、hyperLog、hash的数据结构是什么?keyvalue108.描述:a请求到达nginx的整个处理过程(nginx会调用自己什么逻辑),如何与php通信,中间是什么过程等?109.nginx和php-fpm的配置,问一下各个参数是什么意思就可以了。php-fpm可以通过tcpsocket和unixsocket实现。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查询优化的本质,并给出两个例子114.设计一个秒杀系统,如何保证产品不超卖?115.单例模式有什么优点?什么是抽象类?您还知道哪些其他设计模式?单例模式,也称为责任模式,用于在程序中创建单一的函数访问点。通俗地说,实例化的对象是唯一的。所有的单例模式至少有以下三个共同的元素:它们必须有一个构造函数并且必须被标记为私有它们有一个静态成员变量来保存类的实例它们有一个公共静态方法来访问这个实例单例一个类不能直接在另一个类中实例化,只能由它自己实例化。它不是创建实例的副本,而是返回对存储在单例类中的实例的引用。抽象类不能被实例化。任何一个类,如果其中至少有一个方法被声明为abstract,那么这个类就必须被声明为abstract。定义为abstract的方法只声明其调用方法(参数),不能定义其具体的功能实现。更多工厂模式适配模式的学习内容,可以访问【与各大工厂对比】优质PHP架构师教程目录。只要能读懂,就能保证你的薪水更上一层楼(持续更新中)。以上内容希望对大家有所帮助。很多PHPer在进阶的时候业务代码写多了总会遇到一些问题和瓶颈,没有方向感。我不知道从哪里开始改进。我整理了一些资料,包括但不限于:分布式架构、高扩展性、高性能、高并发、服务器性能调优、TP6、laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等知识点Advanced进阶干货可以免费分享给大家,需要的可以点击链接领取进阶PHP月薪30k>>>架构师成长之路【免费获取视频和采访文件]
