PHP面试准备

317 阅读7分钟

操作系统(《CSAPP》/《APUE》)

  1. IO 多路复用是什么?有哪些 api?
  2. select 和 epoll 的区别?水平触发和边缘触发的区别是啥?使用的时候需要注意什么?
  3. epoll 储存描述符的数据结构是什么?
  4. select 有描述符限制吗?是多少?
  5. 进程 / 线程 / 协程区别?go 和 swoole 的协程实现有啥区别?(分配资源的基本单位 / 运行和调度的基本单位 / 用户线程,M:N 模型和 N:1 模型)

PHP(php 源代码,主流 php 框架源代码)

  1. 描述一下 cli 模式下的几个生命周期?
  2. php-fpm 运行机制?(master 管理,worker 循环 accept)
  3. php-fpm 模式下,kill -9 master-pid,会怎么样?kill matser-pid 呢?(信号机制)
  4. 内存分配流程?为什么要这么设计?
  5. GC 的出现是为了解决什么问题?什么时候会触发 GC?说下大概流程
  6. php 里的数组是怎么实现的?(这里要注意下 php5 和 php7 实现的区别,优化了非常多)
  7. nginx 和 php-fpm 的通信机制?fast-cgi 和 cgi 区别?
  8. php-fpm 创建 worker 进程的规则是什么?不同场景下怎么选择?
  9. php 和 mysql 的通信机制?长链接和短链接啥区别?怎么实现的?连接池要怎么实现?
  10. swoole 协程的原理?
  11. 依赖注入是什么?如何实现的?能解决什么问题?(代码层面不再依赖具体实现,解耦)

mysql(《高性能 mysql》/《mysql 技术内幕 innodb 储存引擎》)

  1. innodb 的索引组织方式?(聚簇索引必须要很清楚,注意 innodb 聚簇索引叶子结点保存的是完整数据,innodb普通索引叶子保存的是记录的主键,myisam 索引叶子保存的是记录的位置 / 偏移量)
  2. B + 树的结构和插入细节?为什么主键一般都要自增?和 B 树什么区别?为什么索引要使用 B + 树不是 B 树也不是其他的平衡树?为什么redis 可以用跳表?(关键词:页的分裂,随机 IO,缓存体系)
  3. 常见的优化(这里我就不展开了,主要考察覆盖索引查询和最左匹配,其实只要清楚 innodb索引的结构,这些都不需要记忆,自然而然推导出来的)
  4. redolog/undolog/binlog 的区别?binlog 的几种格式?说下两阶段提交?
  5. 事务隔离级别和不同级别会出现的问题,innodb 默认哪个级别?MVCC 怎么实现的?快照读和当前读有啥区别?幻读的问题怎么解决?
  6. 死锁什么时候会出现?应用层应该怎么做避免死锁?mysql 是怎么处理死锁的呢?
  7. int 占多少字节?bigint 呢?int (3) 和 int (11) 有区别吗?可以往 int (3) 里存 1亿吗?varchar 最长多少?
  8. sql 的执行流程(原始 sql-> 词法语法分析生成 AST-> 关系代数表达式(逻辑计划)-> 逻辑优化(谓词下推 / 常量传递)->物理查询优化(计算最佳 cost 路径,扫表还是使用索引,join 算法)-> 执行,仅做参考)

redis(redis 源代码)

  1. sds 的结构是什么?为什么要存长度?跟 c 里的字符串有什么区别?(关键词:获取长度复杂度 O (1) 和 O (n),二进制安全,保存\0,跟 C 库字符串函数可以通用)
  2. hash 怎么实现的?怎么解决 hash 冲突?除了 hashTable 还有别的吗?
  3. zset 怎么实现的?跳表是怎么插入的?为什么选择跳表不用其他平衡二叉树?除了跳表还有别的吗?
  4. rehash 过程?会主动 rehash 吗?
  5. 用 redis 可以实现队列吗?有什么优点和缺点?
  6. 用 redis 怎么实现一个延时队列?
  7. rdb 和 aof 过程?rdb 为什么可以用创建子进程的方式进行?(这里考察一个 cow)这两种持久化方式会丢数据吗?
  8. redis 为什么快?(主要考察一个 IO 多路复用和单线程不加锁)
  9. 一致性哈希是什么?节点较少时数据分布不均匀怎么办?
  10. 简单说下几种 key 的淘汰策略,redis 里的 lru 算法,什么时候会触发?实现细节是什么?怎么保证淘汰合理的 key?
  11. lua 脚本的作用是什么?
  12. 缓存击穿 / 穿透 / 雪崩的处理策略

nginx

  1. LVS 和 Nginx 分别作用在 osi 哪一层?
  2. 负载均衡算法
  3. 数据结构
  4. 布隆过滤器,什么时候用?优点是什么?

算法

leetcode easy 级别的题目,具体我就不写了,难度比较低

常见模式与框架

  1. 常见的设计模式,编码必备
  2. Laravel、ThinkPHP开发必不可少的最新框架
  3. YII、Symfony4.1核心源码剖析

微服务架构与性能优化

  1. Tars分布式RPC框架
  2. Swoft微服务框架
  3. 服务器性能优化
  4. 算法与数据结构

工程化与分布式架构

  1. Linux操作/shell脚本编程
  2. docker容器/自动化部署
  3. 分布式缓存/消息中间件
  4. 分布式架构原理/高并发分流

PHP相关

  1. PHP基础函数使用:数组*、字符串、时间函数、数学函数、
  2. max min array_splice 
  3. 你对面向对象的理解;
  4. PHP消息队列(redis)
  5. PHP传值和传引用的区别和使用
  6. session、cookie优缺点对比
  7. PHP的递归方法
  8. 对开源框架的使用感受及其优缺点对比
  9. 常用设计模式及实际应用
  10. 页面静态化设计

MySQL相关:

  1. SQL语句;
  2. 索引的建立规则和用法;
  3. 如何定位慢查询的原因并给出优化方案;
  4. 如何防止SQL注入(老问题)
  5. 事务的处理机制和回滚机制
  6. 判断分库分表的原则和标准(实际使用到的有哪些,为什么要这样用)
  7. 不同引擎的特点。

nosql相关

  1. redis的数据类型、优缺点以及适用情景
  2. redis如何实现队列
  3. redis和memcache的优缺点对比
  4. MongoDB(最好了解)
  5. redis 的双向链表实现简单的秒杀

Linux相关:

  1. 常用命令:查看log日志、查看进程、查看内存占用情况;
  2. 搭建lnmp/lamp环境;

nginx相关:

  1. nginx反向代理;
  2. 微服务架构;
  3. 高负载和高可用架构。

设计模式

  1. Factory工厂模式
  2. Single单例模式
  3. 注册模式
  4. 适配器模式
  5. 策略模式
  6. 观察者模式
  7. 装饰器模式
  8. Facade模式
  9. IOC和DI
  10. Pipeline模式

框架原理

  1. TP6
  2. Laravel
  3. Symfony
  4. Yii

性能优化

php优化

mysql优化

redis优化

nginx优化

架构

swoole

基础知识

进程模型

Task异步任务

WebSocket

数据库连接池

RPC分布式接口

微服务

设计模式

路由网关

负载均衡

consul服务管理

服务熔断

swoft

linux

linux基础

常用命令

shell脚本

环境配置

编译

版本管理

git的基本使用

git的分支管理

git的冲突解决

测试

单元测试phpunit

自动化部署jenkins

docker容器化

高并发

分布式缓存

redis主从复制

redis分布式集群

redis哨兵

redis数据一致性

redis读写分离

redis雪崩,穿透

消息中间件

  1. rabbitmq消息分发原理
  2. rabbitmq消息路由
  3. rabbitmq消息确认
  4. activemq消息原理
  5. kafka 消息处理

资源共享

  1. 分布式全局id
  2. session共享
  3. 单点登录
  4. 协程调度
  5. 分布式定时任务

搜索

  1. ElasticSearch
  2. RPC框架
  3. 异步IO
  4. 无锁化编程
  5. 并发