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/ |
| 难度 | 频率 | 题目 |
|---|---|---|
| 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 | 高 | 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 文件上传安全与输入过滤实践 |
| 难度 | 频率 | 题目 |
|---|---|---|
| L2 | 中 | 生产环境如何排查 Bug,以及如何在本地复现并调试 |
| L2 | 低 | AI 时代的 PHP 开发者:从工具选择到学习方法论 |
本仓库题目按需自取,以下是几种常见使用方式:
- 突击准备:按「考察频率 = 高」筛选,优先看 L1-L2 题目
- 体系进阶:按主题顺序从 L1 读到 L3,建立完整知识链路
- 查漏补缺:直接翻「追问链」和「易错点」,快速发现认知盲区
- 模拟面试:遮住答案只看标题,尝试自行组织回答后对照
每道题遵循统一模板,包含 6 个区块:
┌─────────────────────────────────┐
│ 一句话结论(≤30 字核心答案) │
├─────────────────────────────────┤
│ 体系讲解(原理 → 机制 → 结论) │
│ └── 含 Mermaid 流程图 │
├─────────────────────────────────┤
│ 考察意图 │
├─────────────────────────────────┤
│ 追问链(3-5 个递进问题 + 简答) │
├─────────────────────────────────┤
│ 易错点(2-3 个高频误区) │
├─────────────────────────────────┤
│ 代码示例(PHP 8.0+ 可运行) │
└─────────────────────────────────┘
感谢所有为本项目提交过 PR / commit 的同学(头像由 GitHub 统计生成,点击可查看完整列表):
- 🐛 勘误:发现事实性错误、过时内容或失效链接
- 💡 新题建议:提议新的面试题目
- 🔬 查证补充:为标注「需查证」的内容提供权威来源
- 📊 难度争议:认为某题难度标注不准确
- 📈 频率争议:认为某题考察频率标注不准确
详细流程请阅读 CONTRIBUTING.md。
本项目基于 Apache License 2.0 开源。
