Maravel-Framework 10.61.0 防止循环依赖

发布: (2026年2月5日 GMT+8 16:03)
2 min read
原文: Dev.to

Source: Dev.to

背景

Laravel 曾多次尝试加入此功能。

问题

Maravel-Framework 中,可宏化(macroable)的类是从容器中解析的。
某些类——例如 \Illuminate\Events\DispatcherIlluminate\Console\Scheduling\Schedule——在从容器解析时会产生循环依赖,这会导致:

  • 段错误(Segmentation faults)
  • 内存耗尽

开发者可能需要花费很长时间来调试这些问题。

解决方案

为提前检测此类情况,此 PR 引入了 10 MB 的硬性内存限制(可通过 app.circular_dependency_memory_limit 配置)。当达到该限制时,会抛出 CircularDependencyException,而不是让进程继续运行直至出现致命错误。

/**
 * Limit of extra memory used to detect circular dependencies
 * when resolving an abstract from container (bytes)
 */
'circular_dependency_memory_limit' => 10_485_760, // 10 MB

错误示例

Illuminate\Contracts\Container\CircularDependencyException
Circular dependency detected while resolving [Illuminate\Console\Scheduling\Schedule].
Memory limit reached or exceeded 10485760 bytes.
Dependencies initial memory (bytes): {"Illuminate\Console\Scheduling\Schedule":27262976}
    at vendor/macropay-solutions/maravel-framework/illuminate/Container/Container.php:886

信息含义

  1. 当开始解析 Illuminate\Console\Scheduling\Schedule 时,PHP 内存使用量(通过 memory_get_usage(true))为 27 262 976 字节
  2. 检测循环会继续,直到内存增长超过 10 MB(10 485 760 字节)。
  3. 若未中止,循环将持续分配内存,直至出现段错误或致命的 “内存不足” 错误。

其他说明

  • 基于时间的限制同样会导致段错误或内存限制致命错误。
  • 最初尝试基于内存增量的限制被证明不可靠。
  • 此改进继承了对 DI 辅助函数的先前更改,该更改避免在应用程序完成启动前对容器调用 make
Back to Blog

相关文章

阅读更多 »