内存泄漏需在同一进程持续运行中观察内存是否单调增长且不回落,关键指标是memory_get_peak_usage(true)持续上升、gc_collect_cycles()后无明显回落,而非重启前后RSS对比。

不能直接说明存在内存泄漏。
FrankenPHP 重启后内存降低,只是反映了「进程生命周期重置」的正常现象,和是否泄漏无关。泄漏必须在同一进程持续运行期间观察内存是否单调增长、且不随请求结束而回落。
memory_get_usage(true) 和 memory_get_peak_usage(true) 才是判断依据:在 Worker 模式下,连续处理数百请求后,若 memory_get_peak_usage(true) 持续上升(比如每 100 个请求涨 2MB),且 gc_collect_cycles() 调用后无明显回落,才构成泄漏嫌疑。
常见误判场景:
立即学习“PHP免费学习笔记(深入)”;
- 你看到重启前 RSS 是 320MB,重启后是 80MB → 这只是进程清空了所有 PHP 对象、OPcache、连接池、日志缓冲区等,完全正常
- Symfony 的
EntityManager缓存没clear(),导致 worker 处理 500 个请求后内存涨到 450MB → 这才是泄漏信号,不是看“重启前后”,而是看“重启后第 1 个请求 vs 第 500 个请求”的内存差值 -
opcache.enable_cli=1开着,所有类永久驻留 → 内存稳定在高位,但不是泄漏,是配置错误
真正要盯的指标是:
-
frankenphp_worker_restarts_total(Prometheus)突增 +frankenphp_queue_depth持续 > 0 → 可能因内存压力触发自动重启,需结合VmRSS日志确认 -
/proc/<pid>/status</pid>中的VmRSS在 30 分钟内上涨超过 100MB 且无平台级释放行为(如手动clearstatcache()或opcache_reset())→ 值得深入分析
别把“常驻进程比短命进程内存高”当成泄漏——那是它该有的样子。泄漏是“本该回落却没回落”的异常累积。



















