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\Dispatcher 或 Illuminate\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
信息含义
- 当开始解析
Illuminate\Console\Scheduling\Schedule时,PHP 内存使用量(通过memory_get_usage(true))为 27 262 976 字节。 - 检测循环会继续,直到内存增长超过 10 MB(10 485 760 字节)。
- 若未中止,循环将持续分配内存,直至出现段错误或致命的 “内存不足” 错误。
其他说明
- 基于时间的限制同样会导致段错误或内存限制致命错误。
- 最初尝试基于内存增量的限制被证明不可靠。
- 此改进继承了对 DI 辅助函数的先前更改,该更改避免在应用程序完成启动前对容器调用
make。