JD核心考察点:PHP基础/Swoole/高性能高并发/Linux/Docker+K8s/阿里云/算法数据结构/加分项爬虫、Shell、Go、网络
模块一:PHP基础 & 业务开发(基础必问)
1. 简答题:PHP中static静态变量和普通全局变量的区别,在协程Swoole下有什么坑?
参考答案
- • static静态变量:仅函数内部可见,函数首次执行初始化,生命周期跟随进程/协程,函数重复调用复用值;
- 2. Swoole协程大坑
Swoole单进程多协程共享内存,函数内static变量会被所有协程共用,并发请求下出现数据错乱、串数据;
解决方案:协程场景不用函数static,改用协程上下文Co::getuid()隔离存储。
2. 问答题:如何写出可维护、高质量PHP代码?
参考答案
- 1. 规范层面:遵循PSR1/PSR2/PSR12代码规范,统一命名、注释、文件结构;
- 2. 架构分层:MVC/DDD分层,控制器只处理入参,业务逻辑抽离Service,数据库操作封装Model;
- 3. 健壮性:参数校验、异常捕获、日志埋点,禁止裸SQL防注入;
- 6. 单元测试:核心业务编写PHPUnit单元测试,迭代不回归。
3. 实操题:百万级数据批量插入MySQL,原生PHP怎么优化?
参考答案
- 1. 关闭自动提交:
$pdo->beginTransaction()事务批量插入,最后统一commit; - 2. 拼接多值SQL:
INSERT INTO table (a,b) VALUES (),(),(),单次插入1000条以内; - 5. 禁用缓冲查询、关闭外键约束临时提升写入速度。
模块二:Swoole/高性能高并发(JD核心优先项)
1. 基础题:Swoole同步阻塞和协程异步的适用场景,协程的底层原理?
参考答案
- • 同步阻塞:简单脚本、低并发定时任务,上手简单;
- • 协程异步:高并发HTTP服务、RPC、数据库/Redis IO密集型场景,单进程万级并发。
- 2. 协程底层原理
基于IO多路复用(epoll)+用户态切换,无内核切换开销;代码遇到阻塞IO(mysql/redis/http)时,Swoole自动保存当前协程上下文,切去执行其他就绪协程,IO完成后恢复上下文继续执行。
2. 场景题:Swoole服务出现大量请求超时、并发升高CPU打满,排查思路?
参考答案
- 1. 看CPU:CPU100% → 存在同步阻塞代码(循环大数据、无缓存重复计算、同步文件读写);
- 2. IO超时:数据库/Redis无协程客户端、未设置超时时间、连接池耗尽;
- 3. 连接池:MySQL/Redis连接数配置过小,并发排队等待;
- 4. 内存泄漏:全局/静态变量无限追加数据、协程未释放资源;
- 5. 监控工具:swoole_status、协程追踪工具定位阻塞协程堆栈。
3. 对比题:Swoole和Hyperf框架的区别,各自优势?
参考答案
- 1. Swoole:底层C扩展,纯原生无封装,自由度极高;适合自主搭建RPC、网关、长连接服务;需要自己封装连接池、路由、依赖注入;
- 2. Hyperf:基于Swoole封装完整协程框架,开箱即用;自带DI、中间件、连接池、定时任务、微服务组件;开发效率高,企业自研项目首选;
共同点:全部支持协程、异步IO,解决PHP-FPM同步阻塞并发瓶颈。
4. 高并发场景题:秒杀系统PHP后端怎么设计抗高并发?
参考答案
- 2. 中间层削峰:Redis预存库存,Lua脚本原子扣减库存,防止超卖;
- 3. 异步解耦:成功下单消息丢入RabbitMQ,后端消费者异步创建订单,同步流程只做库存校验;
- 4. 分层缓存:商品信息本地缓存+Redis缓存,减少DB查询;
- 5. 服务扩容:Swoole服务容器化K8s弹性扩容;
- 6. 兜底降级:库存不足直接返回,拒绝无效DB查询。
模块三:Linux / Docker / K8s / 阿里云运维部署(JD硬性要求)
1. Linux实操题:服务器CPU飙升、磁盘占满、端口占用,分别用什么命令排查?
参考答案
- 1. CPU高:
top/htop看进程占用,ps -efH定位PHP/Swoole进程; - 2. 磁盘满:
df -h看分区,du -sh *逐级查找大文件日志; - 3. 端口占用:
netstat -tlnp | grep 端口 / ss -tlnp,查看占用进程PID; - 4. 日志排查:
tail -f实时日志、grep检索报错、dmesg查看系统内核报错。
2. Docker问答题:写出PHP-Swoole业务标准Dockerfile优化要点
参考答案
# 多阶段构建减小镜像体积
FROM php:swoole-base as builder
COPY composer.json .
RUN composer install --no-dev
# 运行层
FROM php:swoole-runtime
COPY --from=builder /vendor ./vendor
COPY . .
# 1. 非root用户运行,安全规避权限漏洞
RUN useradd app && su app
# 2. 清理apt缓存、无用扩展减小镜像
# 3. 健康检查HEALTHCHECK监控服务存活
HEALTHCHECK --interval=5s --timeout=3s CMD curl http://127.0.0.1:9501/health || exit 1
# 4. 限制容器CPU/内存资源
ENTRYPOINT ["php","server.php"]
优化点:多阶段构建、非root运行、健康检查、清理冗余包、资源限制。
3. K8s简答题:解释Pod、Deployment、Service作用,PHP项目部署核心yaml配置?
参考答案
- • Pod:最小调度单元,一个Pod运行一组容器(PHP业务容器);
- • Deployment:管控Pod副本数,实现滚动更新、自愈扩容;
- • Service:固定访问入口,集群内负载均衡,屏蔽PodIP变化;
- • Deployment:设置副本数、镜像地址、资源limits/requests、健康探针;
- • Service:ClusterIP集群内部访问;
4. 阿里云问答题:PHP线上业务会用到哪些阿里云产品?各自作用
参考答案
- 1. ECS/ACK:服务器、K8s容器集群部署业务;
- 2. RDS MySQL:托管数据库,自动备份、高可用;
- 3. Redis云数据库:缓存、分布式锁、库存计数;
- 4. SLB负载均衡:前端流量分发到后端PHP服务;
- 6. SLS日志服务:统一收集PHP日志,检索告警;
模块四:算法、加分项(网络、Shell、爬虫、Go)
1. 算法基础题:数组去重、找出数组重复数字,写出PHP最优实现
参考答案
// 方法1:哈希表(时间复杂度O(n),最优)
functiongetRepeat($arr) {
$map = [];
$repeat = [];
foreach ($arras$v) {
if (isset($map[$v])) {
$repeat[] = $v;
}
$map[$v] = true;
}
returnarray_unique($repeat);
}
// 数组去重:array_flip(array_flip($arr)) 比array_unique性能更高
复杂度说明:哈希查找O(1),整体线性时间;排序去重需要O(nlogn),大数据量性能差。
2. 计算机网络加分题:HTTP1.1、HTTP2、TCP长连接区别,Swoole长连接优化手段
参考答案
- 1. HTTP1.1:串行请求,队头阻塞,每个请求新建/复用短连接;
- 2. HTTP2:多路复用,单连接并发多个请求,头部压缩;
- 3. TCP长连接:Swoole WebSocket/TCP网关,单连接持续双向通信;
优化手段:开启TCP_NODELAY、心跳检测踢空闲连接、连接池复用、数据包分包粘包处理。
3. Shell自动化运维题:写一个shell脚本定时清理PHP项目7天前日志
参考答案
#!/bin/bash
# 日志目录
LOG_PATH=/data/php/logs
# 删除7天前.log日志文件
find $LOG_PATH -name "*.log" -type f -mtime +7 -delete
# 输出清理日志
echo "`date` 清理7天前日志完成" >> /data/php/clean_log.log
配合crontab定时:0 3 * * * /bin/sh /script/clean_log.sh 凌晨3点自动执行。
4. 爬虫加分题:PHP简单爬虫如何防封禁、处理并发采集?
参考答案
- 1. 防封禁:随机User-Agent、请求间隔sleep、代理IP池轮换、携带Cookie模拟浏览器;
- 2. 并发采集:Swoole协程并发请求,避免同步循环串行爬取;
- 3. 数据处理:Redis临时存储采集队列,分批次入库MySQL,防止内存溢出。
5. Go语言加分提问答题:简单说Go对比PHP适合什么场景,你写过哪些Go业务?
参考答案
- 1. Go优势:原生协程、编译型语言、高性能、内存占用低、适合网关、消息消费、定时任务、微服务中间件;
- 2. PHP适合:Web业务、快速迭代、CRUD业务;
- 3. 结合场景:业务主体PHP,高IO消费、限流网关、数据同步工具使用Go开发,提升吞吐。
模块五:综合场景面试大题(HR/技术主管终面)
1. 综合场景题:接手一个老旧PHP-FPM项目,并发高卡顿、无容器化,完整重构优化方案
参考答案
- 1. 底层改造:替换PHP-FPM为Hyperf/Swoole协程服务,消除同步阻塞瓶颈;
- 2. 存储优化:热点数据Redis缓存,慢SQL索引优化,分库分表处理大数据;
- 3. 架构解耦:核心异步逻辑抽离MQ消息队列,削峰填谷;
- 4. 部署改造:Docker打包业务,迁移阿里云ACK K8s集群,实现弹性扩容;
- 5. 观测建设:接入SLS日志、链路追踪、监控告警,提前发现性能瓶颈;
- 6. 自动化:Shell/Python脚本自动化发布、备份、巡检。
2. 沟通协作题:产品需求频繁变更,测试反馈线上bug,你怎么处理?
参考答案
- 1. 需求阶段:提前和产品梳理边界、预估并发量,提前提出性能风险,减少后期返工;
- 2. Bug处理:优先复现bug,定位根因修复,补充单元测试防止复现;
- 3. 流程优化:推动需求评审、灰度发布机制,小流量验证后全量上线;
- 4. 跨团队同步:同步修复进度给测试、产品,同步优化方案,对齐预期。
3. 职业规划题:作为PHP中级自研工程师,未来技术深耕方向?
参考答案
深耕云原生高性能后端路线:
- 1. 夯实Swoole协程、微服务架构,独立负责核心高并发模块设计;
- 2. 吃透K8s、容器化运维,具备完整项目上云落地能力;
- 4. 沉淀高并发、大数据处理解决方案,向高级后端/架构师发展。