PHP 面试问答

June 5, 2026 · View on GitHub

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 / 面试官 / 业务方协作链路)见 面试全景图

难度图例

标签全称定位适合谁
L1Level 1能正确使用,知道"是什么"初级工程师(0-1 年)
L2Level 2能合理选择,知道"怎么用好"中级工程师(1-3 年)
L3Level 3能解释原理,知道"为什么这样"高级工程师(3-5 年)
L4Level 4能设计方案,源码级理解资深工程师(5-10 年)
L5Level 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 语言篇

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

数据结构与算法篇

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

计算机网络篇

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

设计模式篇

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

存储与中间件篇

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

架构与分布式篇

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

操作系统与服务器篇

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

安全篇

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

Web 篇

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

番外篇

难度频率题目
L2生产环境如何排查 Bug,以及如何在本地复现并调试
L2AI 时代的 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 开源。