FrankenPHP跑Symfony内存只涨不降先查哪些服务

浅浩小哥_1669

浅浩小哥_1669

2026-10-06

113人浏览

原创

eventdispatcher监听器会堆积:frankenphp常驻进程导致$listeners和$sorted不自动清空,反复addlistener且未removelistener或使用闭包监听器易引发内存泄漏。

frankenphp跑symfony内存只涨不降先查哪些服务

先看 EventDispatcher 和监听器是否堆积

FrankenPHP 是常驻进程,EventDispatcher 的 $listeners 和 $sorted 数组不会随请求结束自动清空。如果代码里反复调用 addListener()(比如在控制器或命令中动态注册),而没配对调用 removeListener(),监听器条目会越积越多。

更危险的是闭包监听器:哪怕调用了 removeListener(),只要闭包捕获了 $em、$container 或大数组,PHP GC 就无法回收——闭包对象本身还活着,捕获的变量就被强引用锁死。

  • 检查点:bin/console debug:event-dispatcher 看监听器数量是否异常增长
  • 临时加日志:在 addListener() 前打点,确认调用频次和上下文
  • 优先改用类方法注册:[$this, 'onUserCreated'] 比 function () use ($bigData) { ... } 安全得多

查 Doctrine EntityManager 一级缓存是否未 clear()

Symfony 默认不自动 clear() EntityManager,尤其在 FrankenPHP 的长生命周期里,实体持续堆积在一级缓存中,$em->find() 越多,内存占用越不可控。

现象是:压测几轮后,memory_get_usage(true) 持续上涨,且 gc_collect_cycles() 无效——因为实体仍被 $em 强引用着。

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载
  • 必须在每个请求结束前手动调用:$this->em->clear()(不是 close())
  • 若使用自定义中间件或内核事件(如 kernel.terminate),确保它在 FrankenPHP 的 worker 生命周期内可靠触发
  • 禁用二级缓存:测试/生产环境配置 doctrine.orm.default_entity_manager.cache.driver: null

盯住 Symfony 的服务容器是否重复实例化

FrankenPHP 启动时加载一次 DI 容器,但某些配置会导致服务“每次请求都新建”——比如把 public: true 且带构造参数的服务设为 autowire: true,又没显式声明 shared: true,就可能意外创建多个实例。

典型高内存服务:HttpClient、CachePool、自定义的 LargeDataProcessor 类。它们一旦被多次实例化,内存几乎不释放。

  • 运行:bin/console debug:container --show-private,按内存预期排序看哪些服务实例数异常
  • 重点检查 services.yaml 中是否漏写 shared: false(仅当真需要非共享时才设)
  • 避免在 __construct() 中做重量级初始化;改用懒加载或 reset() 方法

确认 var-dumper 的 refCount 是否暴露循环引用

FrankenPHP 下 dump 大对象(如整个 User 实体树)后内存不降,不一定是泄漏,但 symfony/var-dumper 的 refCount 是关键线索:它虽不是实时值,却是克隆快照中唯一能直接指向循环引用的信号。

当某个对象的 refCount > 1 且类型为 Stub::TYPE_OBJECT,基本可断定它被多个父节点持有——比如同时被 $em、$cache 和一个未清理的闭包监听器引用。

  • 必须调用:$cloner->cloneVar($var) 才能触发完整计数逻辑;直接 dump($var) 不行
  • 在疑似泄漏点前后各采一次快照,对比 refCount 变化趋势
  • 注意排除 __sleep() 干扰:该钩子可能绕过克隆路径,导致 refCount 显示偏低
FrankenPHP 的内存问题往往不是单点故障,而是多个“本该释放却没释放”的环节叠加。最易被忽略的是:监听器移除后闭包仍存活、EntityManager 缓存跨请求累积、以及服务容器配置里那个没写的 shared: true。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
PHP Symfony框架
PHP Symfony框架

本专题专注于PHP主流框架Symfony的学习与应用,系统讲解路由与控制器、依赖注入、ORM数据操作、模板引擎、表单与验证、安全认证及API开发等核心内容。通过企业管理系统、内容管理平台与电商后台等实战案例,帮助学员全面掌握Symfony在企业级应用开发中的实践技能。

2025.09.11

5037

17

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

80

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

80

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

80

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

60

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

60

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

280

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

160

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

140

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习