PHP后端(CI框架方向)面试题库,分为基础必问、MySQL、Redis、工程运维、高阶加分、场景实操六大模块,适配该JD全部考点,附带标准答案 一、PHPCodeIgniter框架基础岗位硬性必考点1. 请简述PHP7相较PHP5核心性能、语法层面的关键优化答案1. 性能引入Zend引擎第7代优化变量存储结构zval重构降低内存占用常规场景性能提升2~4倍大幅降低对象、数组内存开销2. 语法新增标量类型声明、返回值类型声明、空合并运算符??、太空船运算符、匿名类移除老旧废弃扩展、mysql原生扩展强制使用mysqli/pdo3. 错误处理将多数致命错误转为可捕获异常适配try-catch4. 异步支持更好兼容Swoole等常驻内存框架。2. 单例、工厂、观察者三种设计模式的适用业务场景结合PHP举例答案• 单例保证一个类全局仅创建一个实例常用于数据库连接、Redis客户端、配置管理器避免重复创建连接浪费资源CI底层数据库驱动就使用单例管理连接。• 工厂模式封装对象创建逻辑调用方无需关心类实例化细节比如封装不同支付渠道类统一工厂方法获取支付实例新增支付方式无需修改上层业务代码。• 观察者定义事件与订阅者事件触发时批量通知多个订阅逻辑例如订单完成后同时触发发券、短信通知、统计埋点多个逻辑实现业务解耦。3. 讲解CI框架MVC架构、路由执行流程请求从进入框架到返回响应完整链路答案1. MVC分工• Model封装数据库读写、数据校验逻辑• View页面模板渲染接口开发可省略视图层直接返回JSON• Controller接收请求、调度模型、组装返回数据。2. 执行流程1访问入口index.php初始化框架环境、加载全局配置2路由解析读取URL/自定义路由配置匹配对应的控制器、方法、URL参数3实例化控制器调用目标方法4控制器调用Model查询数据可借助Library自定义扩展封装通用逻辑5数据组装后直接输出JSON或渲染View模板返回响应。4. CI如何自定义扩展、二次开发举例两种常用扩展方式答案1. 自定义Library库把通用逻辑鉴权、OSS上传封装成库控制器内通过$this-load-library()加载调用2. 自定义Model基类新建基础Model封装通用分页、软删除方法业务Model继承该基类复用逻辑3. 使用钩子Hooks在框架生命周期各个节点植入自定义逻辑例如请求前置校验、全局日志记录不用修改框架内核代码。5. RESTful API设计规范是什么JWT做接口鉴权的实现思路、优缺点答案RESTful规范• 使用HTTP动词代表操作GET查询、POST新增、PUT修改、DELETE删除• URL使用名词不用动词例/users代表用户资源• 通过状态码标识请求结果200成功、401未授权、403权限不足、404资源不存在• 请求、响应统一JSON格式。JWT鉴权思路用户登录成功后生成包含用户id、过期时间的三段式令牌头部、载荷、签名返回前端前端后续请求请求头携带token后端校验签名、有效期确认身份。优缺点优点无服务端会话存储适合分布式部署跨服务、跨端适配性好缺点令牌签发后未到期无法主动作废载荷不能存放敏感信息一般搭配Redis黑名单实现强制下线。6. Composer作用是什么autoload自动加载原理答案Composer是PHP依赖包管理工具可以引入第三方开源库、管理版本、处理依赖冲突自动加载基于PSR-4规范注册自动加载函数调用类时根据命名空间映射文件路径自动require引入对应php文件无需手动写大量include语句CI4原生适配Composer自动加载。二、MySQL数据库专项JD核心考点1. 数据库范式、反范式分别适用什么场景做表设计如何取舍答案• 三大范式核心字段原子性、主键唯一、消除非主键字段传递依赖优点减少数据冗余保证数据一致性适合订单流水、财务这类强一致性写入场景。• 反范式刻意冗余部分字段多表查询无需关联适合读多写少、高并发查询场景例如商品列表冗余分类名称避免频繁联表查询牺牲少量写入性能换取查询速度。取舍写入频繁、对一致性严格遵循范式查询压力大、报表类业务采用反范式加冗余字段。2. SQL慢查询优化完整流程Explain关键字段含义答案优化流程开启慢查询日志抓取慢SQL → Explain分析执行计划 → 新增/调整索引 → 改写SQL拆分大分页、减少联表 → 压测验证性能。Explain关键字段1.type访问类型最优system/const日常需要达到range/refall全表扫描必须优化2.key实际命中使用的索引3.rows预估扫描行数数值越大性能越差4.Extra出现Using filesort文件排序、Using temporary临时表代表需要优化。3. MySQL四种事务隔离级别分别解决什么并发问题死锁产生条件、常规解决手段答案四个隔离级别从低到高1. 读未提交可读取其他事务未提交数据会出现脏读、不可重复读、幻读2. 读已提交解决脏读存在不可重复读、幻读MySQL InnoDB默认隔离级别3. 可重复读解决脏读、不可重复读通过MVCC降低幻读影响4. 串行化所有事务串行执行彻底解决三类并发问题并发性能极差。死锁四大必要条件互斥、请求保持、不可剥夺、循环等待解决手段统一SQL锁表顺序、降低事务粒度缩短事务执行时间、添加死锁检测、设置超时自动回滚。三、Redis专项高频面试题1. Redis五种基础数据结构业务使用场景答案1. String缓存用户基础信息、计数器、接口限流计数2. Hash存储用户详情、商品属性这类结构化字段无需序列化整个对象3. List简单消息队列、最新消息列表4. Set去重场景点赞、共同好友5. Sorted Set排行榜、延时队列依靠分值排序。2. 缓存雪崩、穿透、击穿分别是什么对应解决方案答案1. 缓存雪崩大量key同一时间过期大量请求打到数据库方案过期时间加随机偏移、搭建Redis集群、服务限流降级。2. 缓存穿透请求查询数据库不存在的数据绕过缓存反复查库方案布隆过滤器、空结果短期缓存。3. 缓存击穿热点key过期海量并发请求直达数据库方案热点key永不过期、互斥分布式锁控制单线程重建缓存。3. Redis RDB、AOF两种持久化区别主从、哨兵架构作用答案• RDB定时生成二进制快照文件恢复速度快可能丢失最近一段时间数据适合冷备份。• AOF记录每一条写命令数据安全性高文件体积大恢复慢日常生产两者混合开启。主从复制主库写入从库分担查询压力读写分离哨兵监控主节点状态主库故障自动选举新主库实现故障转移保障高可用。4. 基于Redis实现分布式锁Redlock核心思路答案1. 使用set key value NX EX 过期时间原子指令加锁防止死锁2. 锁value存入当前请求唯一标识解锁时校验归属避免误删其他线程锁3. Redlock部署多独立Redis节点超过半数节点加锁成功才算获取锁规避单节点故障导致锁失效适配分布式集群场景。四、Linux、Nginx、PHP-FPM、Docker运维部署类1. LNMP架构请求完整链路Nginx、PHP-FPM各自职责答案请求链路用户请求抵达Nginx → Nginx判断静态资源直接返回PHP请求转发给PHP-FPM → PHP-FPM调配子进程执行PHP代码查询MySQL/Redis → 结果原路返回Nginx再返回客户端。Nginx负责请求转发、负载均衡、静态资源缓存、限流PHP-FPM管理PHP进程池执行PHP脚本管控进程数量、请求超时。2 PHP-FPM常用调优参数以及调优思路答案核心参数pm进程管理模式日常用dynamic动态模式pm.max_children最大子进程数依据服务器CPU、内存配置pm.start_servers启动常驻进程pm.max_requests单个进程处理请求上限到达后销毁重建规避内存泄漏调优思路内存充足就上调进程数接口慢就调高请求超时时间观察进程内存占用设置合理max_requests。3 Docker、CI/CD给PHP项目带来什么收益简述自动化部署流程答案Docker打包运行环境开发、测试、生产环境一致解决环境不一致问题容器资源隔离扩容便捷。CI/CD流程代码提交Git触发流水线 → 执行代码静态检测、单元测试 → 构建PHP镜像推送仓库 → 测试环境部署验证 → 生产环境灰度发布。五、加分项高阶面试题1 Swoole/Workerman常驻内存框架对比传统PHP-FPM优势答案传统PHP-FPM每次请求初始化销毁进程重复加载框架性能损耗大Swoole常驻内存框架、数据库连接只初始化一次支持协程、异步任务、websocket适合秒杀、长连接这类高并发场景。2 RabbitMQ/Kafka/Redis Streams消息队列适用场景PHP如何消费消息答案• Redis Streams轻量级小规模异步任务、订单通知• RabbitMQ可靠性高支持死信队列、重试适合订单、支付关键业务• Kafka吞吐量极高日志、大数据埋点采集场景PHP消费方式常驻脚本通过Swoole/CLI轮询队列异步执行发短信、统计等任务削峰填谷抵御流量洪峰。六、业务场景实操面试题模拟工作真实需求场景题1商品查询接口流量上涨数据库CPU打满请给出完整优化方案参考答案1. 接入Redis缓存商品列表、详情设置合理过期时间拦截大部分查询请求做好缓存穿透、雪崩防护2. 优化MySQL给查询条件建立联合索引改写低效SQL、深分页读写分离查询走从库3. Nginx层面做静态化、限流热点商品页面静态缓存4. 大促峰值接入消息队列削峰延后非核心统计逻辑。场景题2基于CI框架开发一套JWT登录接口简述实现步骤参考答案1. 封装JWT工具库放入CI的library目录2. 登录控制器接收账号密码校验数据库用户信息验证通过后生成JWT令牌3. 封装全局钩子接口请求前校验请求头内token合法性、有效期校验失败直接返回4014. 强制下线场景将token存入Redis黑名单钩子校验黑名单拦截失效令牌。场景题3线上出现慢查询业务频繁报错数据库死锁排查优化手段参考答案1. 抓取死锁日志查看互相锁住的SQL统一业务更新数据的锁顺序2. 缩小事务范围把非数据库操作移出事务降低事务执行时长3. 为更新条件建立索引避免行锁升级为表锁4. 极端场景增加重试机制捕获死锁异常后重试事务。

本月热点