colinlet/PHP-Interview-QA
colinlet/PHP-Interview-QA has 2,965 GitHub stars and 562 forks. GitHot measured 0 stars in 24 hours. Last checked 2026-11-06 19:48 UTC. Last push 2026-10-27.
系统性的 PHP 技术面试问答大全(面经)。涵盖 PHP8、MySQL、Redis、Nginx、系统设计、算法、Laravel 源码及高并发架构原理,助你斩获后端研发 Offer。PHP Interview Questions & Answers.
Measured star growth
- in 24h
- 0
- in 7 days
- Collecting history
- in 15 days
- Collecting history
- in 1 month
- Collecting history
Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.
README.md
OriginalPHP 面试问答
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 | 高 | 原地移除数组中的指定元素(快慢指针) |
| 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 机制 |
| L4 | 高 | 缓存与数据库双写一致性方案如何选型? |
| L4 | 高 | 高并发下缓存击穿防护方案如何量化选型? |
架构与分布式篇
| 难度 | 频率 | 题目 |
|---|---|---|
| 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 文件上传安全与输入过滤实践 |
Web 篇
番外篇
| 难度 | 频率 | 题目 |
|---|---|---|
| L2 | 中 | 生产环境如何排查 Bug,以及如何在本地复现并调试 |
| L2 | 低 | AI 时代的 PHP 开发者:从工具选择到学习方法论 |
学习路径
本仓库题目按需自取,以下是几种常见使用方式:
- 突击准备:按「考察频率 = 高」筛选,优先看 L1-L2 题目
- 体系进阶:按主题顺序从 L1 读到 L3,建立完整知识链路
- 查漏补缺:直接翻「追问链」和「易错点」,快速发现认知盲区
- 模拟面试:遮住答案只看标题,尝试自行组织回答后对照
单题结构说明
每道题遵循统一模板,包含 6 个区块:
┌─────────────────────────────────┐
│ 一句话结论(≤30 字核心答案) │
├─────────────────────────────────┤
│ 体系讲解(原理 → 机制 → 结论) │
│ └── 含 Mermaid 流程图 │
├─────────────────────────────────┤
│ 考察意图 │
├─────────────────────────────────┤
│ 追问链(3-5 个递进问题 + 简答) │
├─────────────────────────────────┤
│ 易错点(2-3 个高频误区) │
├─────────────────────────────────┤
│ 代码示例(PHP 8.0+ 可运行) │
└─────────────────────────────────┘
参与贡献
感谢所有为本项目提交过 PR / commit 的同学(头像由 GitHub 统计生成,点击可查看完整列表):
欢迎提 Issue 或 PR,贡献方式包括:
- 🐛 勘误:发现事实性错误、过时内容或失效链接
- 💡 新题建议:提议新的面试题目
- 🔬 查证补充:为标注「需查证」的内容提供权威来源
- 📊 难度争议:认为某题难度标注不准确
- 📈 频率争议:认为某题考察频率标注不准确
详细流程请阅读 CONTRIBUTING.md。
License
本项目基于 Apache License 2.0 开源。
Explore related projects
Asabeneh/30-Days-Of-Python
The 30 Days of Python programming challenge is a step-by-step guide to learn the Python programming language in 30 days. This challenge may take more than 100 days. Follow your own pace. These videos may help too: https://www.youtube.com/channel/UC7PNRuno1rzYPb1xLa4yktw
78,236 starsgrafana/grafana
The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
77,725 starsredis/redis
For developers, who are building real-time data-driven applications, Redis is the preferred, fastest, and most feature-rich cache, data structure server, and document and vector query engine.
77,201 starsapache/superset
Apache Superset is a Data Visualization and Data Exploration Platform
75,439 stars