Skip to content

colinlet/PHP-Interview-QA

Repository files navigation

PHP 面试问答

Stars Forks License Questions 在线阅读 Last Updated

PHP 很没前途,请把工作留给我,谢谢!

系统性整理 PHP 技术面试高频问题,覆盖 PHP 语言、数据结构与算法、计算机网络、设计模式、存储与中间件、架构与分布式、操作系统与服务器、安全、Web、番外等方向。每道题包含一句话结论、体系讲解、追问链、易错点与可运行代码示例。

📖 在线阅读:colinlet.github.io/PHP-Interview-QA


求职行动链

求职行动链

求职行动链:投递 → 笔试 → 技术初面 → 技术终面 → 交叉面 → 综合面 → 谈薪/接受Offer

行动环节 求职者可以主动作为
1. 投递简历 / 内推 针对目标公司技术栈定制简历,量化成果;通过人脉或社区激活内推,获取真实反馈;前置调研公司产品与技术挑战,在简历中埋下匹配点。
2. 笔试 / 在线测试 靶向刷题:PHP 常见坑、数组函数、魔术方法、命名空间烂熟于心,辅以基本算法与数据结构;模拟限时编码环境,养成一次写对、注重边界条件的习惯;遇到模糊需求主动在平台提问澄清,展现严谨。
3. 技术初面 将八股文讲成理解,用实际场景解释 Redis 数据结构等知识点;准备 1 分钟埋钩子的自我介绍,引导面试官追问你最熟悉的项目;遇到不会的题不沉默,说出思考路径与排查方向。
4. 技术终面 用 STAR 法则深挖每个核心项目,突出个人决策与分析;主动要求画架构图,练习短链、秒杀、IM 消息推送等系统设计题,计算流量与存储;介绍技术选型时埋下对比方案,促成高质量追问。
5. 交叉面 展现可迁移能力,举例说明代码规范落地、跨团队协作的真实经验;准备有深度的问题反向调研对方(如“当前最大技术债是什么?”);用“我们”传递协作感,描述冲突时强调如何达成共识。
6. 综合面(HR/业务) 设计连贯的职业故事线,正面解释离职原因,具体说明来这里的动机;提前准备价值观问题(缺点、失败案例等)并附带改进动作;询问团队结构、培养机制,展现长期主义。
7. 谈薪 / 接受 Offer 面试中后期明确薪资期望,终面后主动提供流水等材料加速审批;以年度总包(现金+股票+奖金+公积金等)为基础做横向比较;书面确认试用期、转正标准、期权行权条件等关键细节,保护自身权益。

完整多方视角(HR / 面试官 / 业务方协作链路)见 面试全景图

难度图例

标签 全称 定位 适合谁
L1 Level 1 能正确使用,知道"是什么" 初级工程师(0-1 年)
L2 Level 2 能合理选择,知道"怎么用好" 中级工程师(1-3 年)
L3 Level 3 能解释原理,知道"为什么这样" 高级工程师(3-5 年)
L4 Level 4 能设计方案,源码级理解 资深工程师(5-10 年)
L5 Level 5 能权衡取舍,系统级决策 架构师(10 年+)

每道题还标注了考察频率(高 / 中 / 低),方便按紧迫度筛选复习重点。


主题导航

主题 目录
PHP 语言篇 docs/php/
数据结构与算法篇 docs/algorithm/
计算机网络篇 docs/network/
设计模式篇 docs/design-pattern/
存储与中间件篇 docs/storage/
架构与分布式篇 docs/architecture/
操作系统与服务器篇 docs/server/
Web 篇 docs/web/
安全篇 docs/security/
番外篇 docs/misc/

题目索引

PHP 语言篇

难度 频率 题目
L1 PHP 8.0 的 match 表达式与 switch 有什么区别?
L1 PHP 8.0 的 nullsafe 运算符(?->)是什么?与 ?? 有何区别?
L1 PHP 中 == 和 === 的区别是什么
L1 PHP 中引用传递与值传递的区别
L1 PHP 索引数组与关联数组的区别及常见操作
L1 PHP 浮点数精度问题是什么?如何用 bcmath 解决?
L1 declare(strict_types=1) 的作用是什么?严格模式与强制模式有何区别?
L1 isset() 与 empty() 有什么区别
L1 PHP 8.0 的命名参数(Named Arguments)是什么?有哪些使用场景?
L1 PHP 动态语言特性与静态语言的区别
L1 PHP 单引号与双引号字符串的区别
L1 PHP 类型强转有哪些方式?各种类型互转的规则是什么?
L1 PHP 的 never 返回类型表示什么?与 void 有何区别?
L1 PHP 的 union types(PHP 8.0)与交集类型(PHP 8.1)有何区别?各自有哪些使用约束?
L2 Composer 自动加载机制与 PSR-4 规范
L2 PHP 中 Error 与 Exception 的区别及异常处理最佳实践
L2 PHP 命名空间的解析规则与别名机制
L2 SOLID 设计原则是什么?各原则的核心意图是什么?
L2 PHP 中 Trait 的作用与冲突解决机制
L2 什么是依赖注入?它解决了什么问题?
L2 抽象类与接口的区别及使用场景
L2 PHP 魔术方法是什么?__get/__set/__call 各适用于哪些场景?
L2 Late Static Binding 是什么及 static:: 与 self:: 的区别
L2 PHP 多范式编程与场景选型
L3 OPcache 编译缓存的工作原理是什么?
L3 PHP 的垃圾回收机制是如何工作的
L3 Fiber 与 Generator 有栈协程与无栈协程的本质区别
L3 Fiber 与 Swoole 协程的能力边界对比
L3 PHP JIT 是什么?Tracing 与 Function 两种模式有何区别?
L3 PHP 请求生命周期的四个阶段
L3 WeakReference 与 WeakMap 如何避免引用计数陷阱?
L3 PHP zval 内部结构是什么?写时复制(COW)机制如何工作?

数据结构与算法篇

难度 频率 题目
L1 原地移除数组中的指定元素(快慢指针)
L1 双指针的两种形式:对撞指针与快慢指针
L1 固定大小滑动窗口求子数组最大和
L1 常见数据结构基础操作的时间复杂度是多少?
L1 算法复杂度分析与 Big-O 表示法
L1 双指针判断回文字符串
L2 如何用一次遍历删除链表倒数第 N 个节点?
L2 如何合并两条有序链表?
L2 哈希冲突的解决策略有哪些?如何用哈希表实现 LRU 缓存?
L2 快速排序与归并排序的原理、稳定性和复杂度如何比较?
L2 递归三要素是什么?如何分析递归的时间复杂度?
L2 链表翻转与 Floyd 环检测
L3 0/1 背包的状态转移方程如何建立?滚动数组如何优化空间?
L3 如何用动态规划求最长公共子序列并还原具体路径?
L3 二分查找的统一模板:搜索边界与答案二分
L3 最长递增子序列(LIS)的 O(n²) 与 O(n log n) 算法有何区别?
L3 记忆化搜索(自顶向下)与自底向上 DP 在实现和性能上有何区别?

计算机网络篇

难度 频率 题目
L1 GET 和 POST 请求的区别
L1 HTTP 的无状态特性与会话保持方案
L1 HTTP 缓存机制:强缓存与协商缓存的区别
L2 HTTPS 的 TLS 握手流程与加密分工
L2 IO 模型:同步/异步与阻塞/非阻塞的区别
L2 PHP 网络并发与连接复用策略
L2 DNS 解析流程与 CDN 接入原理
L2 TCP 粘包的成因与应用层拆包方案
L3 HTTP/2 与 HTTP/3 的核心改进与底层原理
L3 Reactor 模式是如何工作的?与多线程模型相比优势在哪?
L3 epoll 为什么比 select/poll 性能好?IO 多路复用机制对比
L3 epoll 的水平触发(LT)与边缘触发(ET)有什么区别?

设计模式篇

难度 频率 题目
L1 Laravel Facade 命名陷阱——它是"静态代理"还是"门面模式"?
L1 Laravel 框架特性与 GoF 设计模式的对应关系
L1 设计模式的三大分类与意图
L2 PHP 单例模式为什么不需要处理线程安全?
L2 工厂方法与抽象工厂的区别及选型
L2 PHP clone 与原型模式:浅拷贝与深拷贝的实现差异
L2 建造者模式如何解决复杂对象的构造问题?
L3 OCP的设计哲学:隔离变化点而非冻结代码
L3 SRP的变化理由原则:如何量化职责边界
L3 抽象类与接口的设计意图差异:PHP中的选型原则
L3 里氏替换原则的行为契约与继承陷阱

存储与中间件篇

难度 频率 题目
L1 MySQL 中各种 JOIN 的区别是什么?
L1 Redis 有哪五种基本数据类型?各自适用什么场景?
L1 什么是数据库三范式?各范式分别解决了什么问题?
L2 MySQL 四种事务隔离级别与并发问题
L2 MySQL 索引为什么用 B+ 树?聚簇索引与非聚簇索引有什么区别?
L2 缓存穿透、缓存击穿与缓存雪崩的区别及防护方案
L2 什么是覆盖索引?联合索引的最左前缀原则是什么?
L3 MySQL count() 的差异与大表计数优化
L3 MySQL 主从复制延迟的原因与解决
L3 MySQL 一条查询语句的完整执行流程
L3 MySQL 隐式类型转换导致索引失效
L3 ORDER BY 的执行原理与性能优化
L3 读写分离下的一致性陷阱
L3 InnoDB 脏页刷新与 Checkpoint 机制

架构与分布式篇

难度 频率 题目
L2 AP vs CP:Eureka与ZooKeeper的注册中心选型对比
L2 BASE理论:最终一致性的三要素与实现方式
L2 CAP定理:一致性、可用性与分区容忍的三角权衡
L2 一致性哈希:虚拟节点原理与数据迁移最小化
L2 PACELC模型:延迟维度对CAP的补充
L3 API网关的核心职责与设计原则
L3 服务间通信选型:同步HTTP与gRPC对比异步MQ
L3 注册中心原理与选型:Consul、Nacos与Eureka对比
L3 微服务拆分反模式:过度拆分、分布式单体与循环依赖
L3 微服务服务边界划分:业务能力与DDD限界上下文
L4 TCC 方案落地:空回滚、悬挂与幂等三类问题的量化代价与防范
L4 单体拆分微服务后的分布式事务选型
L5 短链系统设计:唯一短码生成方案的架构权衡

操作系统与服务器篇

难度 频率 题目
L1 Linux 文件系统基础——inode、硬链接与软链接、权限位
L1 PHP 开发常用 Linux 命令:文件查找、进程与网络诊断
L1 crontab 计划任务——表达式语法、环境变量陷阱、日志与调试
L1 Vim 常用操作——模式切换、搜索替换、保存退出
L1 sed 流编辑器常用操作——行定址、s 替换、与 awk 的职责分工
L1 nice 与 renice 进程优先级——nice 值范围、对 PHP-FPM/Nginx 的影响
L2 Nginx SSL 终止与 HTTPS 安全配置
L2 Nginx rewrite 规则四种 flag 的行为差异
L2 Nginx 反向代理与 upstream 负载均衡配置
L2 Nginx 限流指令 limit_req 与 limit_conn 的区别
L2 PHP-FPM 进程模型与 FastCGI 协议
L2 Nginx proxy_cache 缓存配置与失效策略
L3 Nginx 的 event-driven 模型与 epoll 多路复用原理
L3 Nginx master/worker 进程架构与信号处理机制
L3 Nginx 与 PHP-FPM 的 FastCGI 通信原理与 Unix Socket vs TCP 选型
L3 LVS 与 Nginx 负载均衡的层级差异与选型依据
L3 Nginx 零拷贝与 sendfile 系统调用原理
L4 Swoole 协程与 PHP-FPM 的选型决策

安全篇

难度 频率 题目
L1 CSRF 攻防基础
L1 SQL 注入防御基础
L1 XSS 攻击类型与防御方案
L1 密码学基础概念辨析
L2 CC 攻击与应用层限流防护方案
L2 Cookie 安全属性完整解析
L2 Session 劫持攻击向量与防护
L2 Session 固定攻击与防御
L3 JWT Token 撤销机制选型
L3 JWT alg:none 与算法混淆攻击
L3 JWT 存储位置安全权衡
L3 PHP 文件上传安全与输入过滤实践

Web 篇

难度 频率 题目
L1 $_SERVER 超全局变量中有哪些常用字段?分别有什么用途?
L1 HTTP 301、302、307 重定向状态码有什么语义差异?如何选择?
L1 HTTP 常见状态码含义与 301 和 302 的区别
L1 PHP 主流框架对比与选型概览
L1 X-Forwarded-For 与 REMOTE_ADDR 有什么区别?如何在代理场景下获取真实客户端 IP?
L1 header() 函数的作用是什么?为什么调用前不能有任何输出?
L1 ob_start() 如何解决 headers already sent 问题?输出缓冲机制是怎样工作的?
L2 PHP 框架中间件机制与洋葱模型
L2 PHP 框架请求生命周期各阶段职责与执行顺序是怎样的?
L2 PHP 框架路由是如何注册、匹配请求并提取 URI 参数的?
L2 服务容器 bind、singleton、instance、make 各自的使用场景与区别是什么?
L3 Laravel 中间件 Pipeline 如何通过 array_reduce 构造洋葱式闭包链?
L3 Laravel 服务容器(IoC)的实现原理
L3 ORM 链式查询如何逐步拼装 SQL?Active Record 与 Data Mapper 有何本质区别?Eager Loading 如何消除 N+1?
L3 框架事件系统如何注册监听器、分发事件?同步事件与队列事件的内部路径有何差异?
L3 路由匹配如何通过前缀树结构与正则预编译实现高性能查找?

番外篇

难度 频率 题目
L2 生产环境如何排查 Bug,以及如何在本地复现并调试
L2 AI 时代的 PHP 开发者:从工具选择到学习方法论

学习路径

本仓库题目按需自取,以下是几种常见使用方式:

  • 突击准备:按「考察频率 = 高」筛选,优先看 L1-L2 题目
  • 体系进阶:按主题顺序从 L1 读到 L3,建立完整知识链路
  • 查漏补缺:直接翻「追问链」和「易错点」,快速发现认知盲区
  • 模拟面试:遮住答案只看标题,尝试自行组织回答后对照

单题结构说明

每道题遵循统一模板,包含 6 个区块:

┌─────────────────────────────────┐
│  一句话结论(≤30 字核心答案)      │
├─────────────────────────────────┤
│  体系讲解(原理 → 机制 → 结论)   │
│  └── 含 Mermaid 流程图           │
├─────────────────────────────────┤
│  考察意图                        │
├─────────────────────────────────┤
│  追问链(3-5 个递进问题 + 简答)   │
├─────────────────────────────────┤
│  易错点(2-3 个高频误区)          │
├─────────────────────────────────┤
│  代码示例(PHP 8.0+ 可运行)      │
└─────────────────────────────────┘

参与贡献

感谢所有为本项目提交过 PR / commit 的同学(头像由 GitHub 统计生成,点击可查看完整列表):

PHP-Interview-QA contributors

欢迎提 Issue 或 PR,贡献方式包括:

  • 🐛 勘误:发现事实性错误、过时内容或失效链接
  • 💡 新题建议:提议新的面试题目
  • 🔬 查证补充:为标注「需查证」的内容提供权威来源
  • 📊 难度争议:认为某题难度标注不准确
  • 📈 频率争议:认为某题考察频率标注不准确

详细流程请阅读 CONTRIBUTING.md


License

本项目基于 Apache License 2.0 开源。

About

系统性的 PHP 技术面试问答大全(面经)。涵盖 PHP8、MySQL、Redis、Nginx、系统设计、算法、Laravel 源码及高并发架构原理,助你斩获后端研发 Offer。PHP Interview Questions & Answers.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors