php最新面试题
中级 PHP 面试抗追问手册(武汉 1w 档)终极版
说明:全是“人话版”,面试官追问 3~4 层也能站住。
每题包含:面试官问 → 人话答 → 追问 → 活法提示。
适合打印、背诵和电脑复习。
目录
- 百万数据量优化
- Laravel 启动流程
- Redis 缓存击穿 / 数据一致
- N+1 查询(Laravel)
- 队列(Laravel)
- Linux / 部署
- 空窗期 + OpenClaw
- 高并发接口设计
- 秒杀 / 抢购设计
- 接口幂等设计
- 分库分表设计
- AI 辅助开发工具(Cursor / Trae / OpenClaw)
百万数据量怎么优化
第一问
面试官:百万数据量的 SQL 怎么优化?
答法:从数据库、代码、缓存三个层面做。
第二问(追)
面试官:索引你怎么建的?
答法:先看最频繁的 SQL,再按 where + order by 建联合索引,避免单字段索引,索引不要越多越好。
第三问(追)
面试官:分页你怎么做?
答法:数据量大不用 offset 分页,用 id 游标分页:where id > last_id limit 20。
第四问(杀)
面试官:排序怎么办?
答法:排序字段 + 查询条件在索引里,避免回表。
⚠️ 作死点
- select *
- 单字段索引不够
- offset 翻页过大
✅ 活法关键词
- 联合索引
- 游标分页
- 三层思路(DB/代码/缓存)
Laravel 启动流程
第一问
面试官:Laravel 启动流程?
答法:
public/index.php入口- Composer 自动加载
- Application 容器初始化
- 核心 ServiceProvider 注册(数据库、缓存、日志)
- 全局中间件 + 路由中间件
- 路由分发 → 控制器 → 模型
第二问(追)
面试官:中间件什么时候执行?
答法:路由匹配后,先全局中间件,再路由中间件,控制器前执行。
第三问(追)
面试官:ServiceProvider 是干嘛的?
答法:初始化系统入口,绑定接口、注册事件、加载配置,全局逻辑不适合放控制器里。
第四问(杀)
面试官:Middleware 和 Provider 什么时候用?
答法:请求相关用 Middleware,系统启动阶段用 Provider。
⚠️ 作死点
- 背诵教材术语
- “就是注册服务”一句带过
✅ 活法关键词
- IOC 容器
- 请求链中间件
- Provider 初始化
Redis 缓存击穿 / 数据一致
第一问
面试官:缓存击穿怎么办?
答法:加锁,防止多个请求同时查数据库。
第二问(追)
面试官:具体怎么加锁?
答法:缓存 miss 后用 setnx 或原子操作,只让一个请求去查数据库。
第三问(追)
面试官:其他请求怎么办?
答法:等一小会,或者返回旧缓存,不让数据库被打爆。
第四问(杀)
面试官:数据不一致怎么办?
答法:以数据库为准,更新时先改库再删缓存,允许短暂不一致。
⚠️ 作死点
- 不考虑高并发
- 背空话 “分布式锁”
✅ 活法关键词
- setnx / 原子操作
- 数据库为准
- 短暂不一致可接受
N+1 查询(Laravel)
第一问
面试官:遇到过 N+1 查询吗?
答法:遇到过,列表循环关联表容易踩。
第二问(追)
面试官:怎么发现的?
答法:慢 SQL / 日志 / 开发调试发现。
第三问(追)
面试官:怎么解决?
答法:用 with() 一次性查出关联数据,避免循环查询数据库。
⚠️ 作死点
- 不查日志
- 循环里查数据库
✅ 活法关键词
- eager loading
- with()
- 慢 SQL
队列(Laravel)
第一问
面试官:你用过队列吗?
答法:用过,发邮件、消息等异步任务。
第二问(追)
面试官:为什么不用同步?
答法:同步拖慢接口响应,影响用户体验。
第三问(追)
面试官:队列失败了怎么办?
答法:失败重试,超过次数进失败队列,人工或定时处理。
⚠️ 作死点
- 队列就是异步,不说失败处理
- 不提延迟/重试机制
✅ 活法关键词
- 异步任务
- 失败队列
- 重试机制
Linux / 部署
第一问
面试官:怎么部署项目?
答法:Linux + Nginx + PHP-FPM
第二问(追)
面试官:PHP-FPM 挂了怎么办?
答法:看日志 → 重启服务 → 排查内存或慢请求
第三问(追)
面试官:怎么防止老挂?
答法:控制并发,优化慢接口,避免单请求耗时过长。
⚠️ 作死点
- 不看日志
- 只重启不查原因
✅ 活法关键词
- 日志
- 并发控制
- 慢接口优化
空窗期 + OpenClaw
第一问
面试官:你这段时间没上班,在干嘛?
答法:整理以前项目技术点,同时用 OpenClaw 做自动化任务,例如定时采集数据、同步数据库。
⚠️ 作死点
- 说“自学”
- 编公司
✅ 活法关键词
- 技术整理
- 自动化
- OpenClaw 实战
高并发接口设计
第一问
面试官:高并发接口你怎么设计?
答法:先从限流、缓存、队列三方面考虑,保证接口在高流量下不会崩。
第二问(追)
面试官:限流你具体怎么做?
答法:用 Redis 计数器或者漏桶/令牌桶算法,对接口做 QPS 限制。
第三问(追)
面试官:缓存策略呢?
答法:热点数据放 Redis,非核心数据用延迟更新或异步刷新,避免缓存击穿。
第四问(杀)
面试官:队列处理失败怎么办?
答法:失败重试,超过次数进失败队列,人工或定时处理。
⚠️ 作死点
- 不考虑限流
- 全靠数据库撑
- 队列失败不处理
✅ 活法关键词
- 限流算法
- Redis 热点缓存
- 队列重试
秒杀 / 抢购设计
第一问
面试官:你做过秒杀系统吗?
答法:有做过,核心是控制库存、限流和抢购请求排队。
第二问(追)
面试官:如何保证库存不超卖?
答法:用 Redis 原子操作减库存,同时异步落库。
第三问(追)
面试官:并发特别高怎么办?
答法:前端请求排队到队列中处理,减少数据库压力;热点缓存防击穿。
第四问(杀)
面试官:如果队列挂了怎么办?
答法:落库后重试失败队列或手工干预,保证最终一致性。
⚠️ 作死点
- 数据库直接减库存
- 没限流、没排队
✅ 活法关键词
- Redis 原子减库存
- 异步队列
- 高并发排队
接口幂等设计
第一问
面试官:接口怎么保证幂等?
答法:使用唯一请求 ID 或 token,重复请求不重复写数据库。
第二问(追)
面试官:支付类接口怎么办?
答法:先生成订单号,接口幂等校验 ID,操作数据库前检查是否已存在,保证重复请求不重复扣款。
第三问(追)
面试官:Redis 怎么帮忙?
答法:请求 ID 可以缓存到 Redis,短时间重复请求直接返回结果,不访问数据库。
⚠️ 作死点
- 只靠数据库约束
- 不考虑重复请求
✅ 活法关键词
- 请求唯一 ID
- Redis 幂等缓存
- 支付安全
分库分表设计
第一问
面试官:你的项目如何分库分表?
答法:按业务或时间拆表、拆库,减少单表压力。
第二问(追)
面试官:如何路由请求?
答法:通过中间件或 DAO 层判断 user_id 或时间,选择对应库和表。
第三问(追)
面试官:事务怎么保证?
答法:跨库事务尽量避免,核心业务用单库事务,其他用最终一致性策略。
第四问(杀)
面试官:数据迁移怎么办?
答法:用脚本批量迁移 + 双写策略,保证新老系统过渡期数据一致。
⚠️ 作死点
- 全靠单库撑
- 跨库事务处理复杂不说
- 不做迁移策略
✅ 活法关键词
- 分库分表
- 中间件路由
- 单库事务 + 最终一致性
AI 辅助开发工具(Cursor / Trae / OpenClaw)
第一问
面试官:你了解 Cursor、Trae、OpenClaw 这些 AI 工具吗?
答法:了解,我平时用这些工具来提升开发效率和自动化运维。
- Cursor:代码生成与智能补全,快速生成函数模板,提高开发速度。
- Trae:AI 辅助测试和调试,分析代码问题和优化建议。
- OpenClaw:自动化数据采集和任务调度,重复操作交给工具做。
第二问(追)
面试官:能具体举个例子你是怎么用的吗?
答法:
- Cursor:Laravel 控制器快速生成 CRUD 方法
- Trae:跑单元测试分析日志发现潜在 bug
- OpenClaw:定时采集第三方数据,同步数据库
第三问(追)
面试官:那你怎么保证 AI 生成的代码没问题?
答法:AI 只做辅助,核心逻辑和数据库操作我都会手动 review,必要时重写或优化。
第四问(杀)
面试官:AI 能替代你开发吗?
答法:AI 只能辅助,不能替代设计思路、业务判断和复杂逻辑开发。
⚠️ 作死点
- 说“全交给 AI 做”
- 不区分辅助和核心逻辑
- 只说工具名,不讲应用场景
✅ 活法关键词
- AI 辅助开发
- 自动化任务
- 代码生成 / 测试 / 数据采集
- 最终逻辑把控在自己手里
-
分享