PHP执行前18秒空闲时间求助:Symfony+API Platform请求延迟
排查API Platform请求前置空闲时间过长的问题
针对你遇到的API Platform请求耗时20秒、且空闲时间出现在index.php执行前的情况,结合EasyAdmin请求正常的对比,给出以下排查方向:
1. 检查PHP-FPM进程配置与状态
API请求通常并发量更高,容易触发PHP-FPM进程队列等待:
- 查看PHP-FPM配置文件(通常在
/etc/php/{version}/fpm/pool.d/www.conf),调整进程参数:pm.max_children:4核服务器可设为20-30,根据实际资源占用调整pm.start_servers、pm.min_spare_servers、pm.max_spare_servers:分别设为8、5、15左右,避免进程频繁启停
- 开启PHP-FPM状态页:在pool配置中添加
pm.status_path = /fpm-status,然后在NGINX配置中添加对应location,访问后查看queue、idle processes、active processes指标,确认是否有请求排队 - 开启PHP-FPM慢日志:设置
slowlog = /var/log/php-fpm-slow.log和request_slowlog_timeout = 5s,查看是否有进程初始化或连接阶段的慢请求
2. 优化NGINX与PHP-FPM的通信
- 将NGINX的
fastcgi_pass从TCP方式(比如127.0.0.1:9000)改为Unix Socket(比如unix:/run/php/php{version}-fpm.sock),减少网络层开销 - 检查NGINX的
fastcgi_connect_timeout、fastcgi_send_timeout、fastcgi_read_timeout设置,建议设为60s,确保超时时间合理 - 查看NGINX的
access.log,对比API和EasyAdmin请求的request_time和upstream_response_time,确认延迟出现在NGINX转发阶段还是PHP-FPM处理前
3. 验证API Platform缓存有效性
虽然你已启用Redis,但API Platform的元数据缓存可能未正确生效:
- 确认
config/packages/api_platform.yaml中cache.metadata.enabled设为true,并配置Redis作为缓存池 - 重新生成Prod环境缓存:执行
bin/console cache:clear --env=prod --no-warmup,再手动预热缓存bin/console cache:warmup --env=prod - 执行
bin/console debug:router查看API路由的缓存状态,确保没有每次请求都重新生成路由规则
4. 系统层面资源排查
- 用
htop监控CPU、内存占用,确认请求高峰期是否有进程资源耗尽 - 用
iostat -x 1查看磁盘IO情况,若%util接近100%,说明磁盘读写瓶颈导致PHP-FPM进程启动或缓存读取缓慢 - 检查系统文件描述符限制:执行
ulimit -n,若数值小于10240,修改/etc/security/limits.conf提高限制,避免NGINX/PHP-FPM无法创建足够连接
5. 排除认证/授权前置延迟
API Platform通常依赖认证机制(如JWT),若认证逻辑涉及外部服务或慢查询,可能在PHP代码执行前的初始化阶段产生延迟:
- 检查JWT配置,确认token验证是否本地完成(如使用本地密钥而非远程服务)
- 对比EasyAdmin和API的认证流程,看API是否有额外的前置检查(如IP白名单、请求头校验)导致阻塞
内容的提问来源于stack exchange,提问作者DJMDZ
相关产品推荐
相关产品推荐

