Maravel-Framework 10.61.0는 순환 의존성을 방지합니다
Source: Dev.to
배경
Laravel에 이 기능을 추가하려는 시도가 여러 번 있었습니다.
문제
Maravel-Framework에서는 매크로 가능한 클래스가 컨테이너에서 해석됩니다.
\Illuminate\Events\Dispatcher 나 Illuminate\Console\Scheduling\Schedule 같은 일부 클래스는 컨테이너에서 해석될 때 순환 의존성을 만들게 됩니다. 이로 인해 다음과 같은 문제가 발생합니다:
- 세그멘테이션 오류
- 메모리 소진
개발자는 이러한 문제를 디버깅하는 데 오랜 시간을 소비할 수 있습니다.
해결책
이러한 경우를 조기에 감지하기 위해, 이 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를 호출하는 것을 방지했습니다.