高级PHP面试题目分享(技术篇)

今年8月份开始就准备从老东家离职看看新的机会,在找新的工作时,给自己定的方向就是PHP或者Java方面的工作,希望找朝阳行业,这期间经历的面试不多,最终拿到心意的offer,也算达到了自己的预期,在此给大家分享下在面试过程中遇到的一些有意思的题目,供大家参考。

我个人在以前做了2年c++,这期间接触到了分布式相关理论和技术框架,也初步研究过一些经典的产品,类似memcache,Thrift等,后续去现在的公司4年,开始接触PHP开发,从最初的PHP单机部署到最终的微服务化,也较完整的经历了整个技术栈的迭代,相对而言,见识较多,只是这期间做了比较多业务,技术上的深耕不够,这也是这次面试一些公司时的软肋。

面试中接触的题目有架构设计和具体技术方面的,下面就分类讨论,一些题目是开放性的,如果大家有更好的答案,可以在评论里面讨论,另外开放性的题目只是提一些方案,具体实施方面不会涉及太多,今年面的公司不多,面了4家后拿到offer,题目有限,请见谅。

一,技术

1、Linux系统中,进程间通信的方式。

进程间通信方式有管道,消息队列,共享内存,socket,文件,信号,互斥量等,不过我在swoole源码中看到了通过eventfd这种方式做进程通信的,这个需要再学习看看。

2、redis和memcache的不同点。

这个不同点有很多,核心的是其进程模型不同衍生出来的,memcache是master+worker的线程模型,其中master完成网络监听后投递到worker线程,由worker线程处理,而redis是单进程单线程模型,即单个线程完成所有的事情,这两种实现造成下面的差异,即redis更容易实现多种数据结构,类似列表,集合,hash,有序集合等,由于是单线程的,如果单实例部署redis,不能全面用到服务器多核的优势,通常部署时,都会通过多实例的方式去部署,redis本身提供持久化方式(AOF+RDB)和集群、分片存储方式,memcache原生不支持持久化、集群、分片部署等。另外,redis内存管理没有什么特殊的算法,通过使用google的jmalloc库来做内存管理(申请,释放),而memcache使用了类似linux的内存管理,即slab内存管理方式。

3、innodb聚簇索引。

聚簇索引是指innodb引擎表中基于主键组织数据的一种方式,innodb引擎中任何表都有主键,如果用户自定义了主键,就用用户自定义的主键,如果用户表没有自定义主键,检查用户表是否有用户自定义的非空的唯一索引,如果有非空的唯一索引,则选用非空的唯一索引做“主键”,如果不满足上述的要求,则默认增加一个6byte的自增整型字段做主键,这个增加的主键业务侧是看不到的,基于这个主键按B+树的方式组织数据,其中B+树的树枝节点存储的是这个主键值,而叶子节点存储的是完整的一条记录,叶子节点也称为数据页,同时多个数据页之间通过双向链表的方式链接,基于主键或者能转换为主键的查询,直接通过聚集索引即可找到所需数据,而辅助索引等叶子节点存储的是主键值,而不是指向主键节点的指针(这点和myisam表有差异),需要查询2次才能找到最终的数据,所以innodb查询优化里面最重要的优化方式就是让SQL能基于聚集索引找到所需数据。关于Innodb索引,后续专门分析。

4、innodb在RR隔离级别下如何解决幻读问题。

innodb的隔离级别总共分四个,即读未提交(RU),不可重复读(RC),可重复读(RR),串行。innodb的默认隔离级别是RR,所谓可重复读是指在一个事务未提交的过程中,多次执行同一个sql,其结果都是一致的,而幻读是指在事务未提交过程中,多次执行同一个SQL,会读取到不同的数据。mysql在解决幻读时采用了Next-Key Locking,这种锁是行锁的一种,如果查询的索引有唯一属性(主键、唯一索引),则Next-Key Locking会演变为锁单条记录的方式实现,否则则采用间隙锁的方式实现,即会锁定查询的一个区间,这样会造成其他事务在该事务执行过程中不能修改记录数据,实现了可重复读,也就是解决了幻读问题,面试这里就讨论这些,关于innodb锁,后面专门写一篇博客讨论。

5、公司RPC框架的整体流程。

我们公司使用的RPC框架是dubbo-php-framework,这个框架目前已经开源,我在我的专栏里面也详细的介绍了这个框架体系,当时面试时,问到框架的,基本上会介绍一些核心流程,我会介绍服务注册发现流程,底层进程模型,面试官感兴趣的也会聊下,这里我就简单说下刚才提到的问题。

(1)底层进程模型,我们框架底层是用swoole完成网络通信的,而swoole的进程模型又分为3种,我们使用的是多进程方式,即有1个master进程,1个manager进程和多个worker进程,worker进程完成业务逻辑处理,manager进程负责管理worker进程,master进程负责Accept新的连接等。

(2)服务注册和发现流程,在Provider(服务提供者)启动时,会将自己的服务地址信息(包括IP,PORT,服务名,接口名等信息)注册到zookeeper中,也就是zookeeper充当配置中心的角色,我们单独写的agent监听zookeeper的节点变更,同时将变更内容更新到本地redis中,在Consumer(服务消费者)在调用时,通过反射,读取本地redis中服务的信息(包括IP,PORT,服务名,接口名等信息)来发生实际的调用,只是这里的调用是跨机器的网络调用。

你可能感兴趣的:(职业发展)