PHP 5에서의 깊은 호출 스택 (Deep call stacks on PHP 5)
PHP는 사실상 무한한 호출 스택을 지원합니다. 하지만 Zend 엔진이 제공하는 함수 호출 훅 zend_execute_ex(PHP 5.4에서는 zend_execute라고 함)는 PHP 메서드와 함수를 네이티브 C 스택을 사용해 호출해요. 이 때문에 PHP의 호출 스택이 매우 깊어지면 스택 오버플로가 발생할 수 있어요.
출처: 문서
본문
PHP는 사실상 무한한 호출 스택을 지원합니다. 그러나 Zend 엔진이 제공하는 함수 호출 훅인 zend_execute_ex(PHP 5.4에서는 zend_execute라고 함)는 PHP 메서드와 함수를 네이티브 C 스택을 사용해 호출합니다. 이로 인해 PHP의 호출 스택이 특히 깊어지면 스택 오버플로가 발생할 수 있어요.
ddtrace 0.48.0 버전부터 PHP 트레이서는 PHP 5에서 zend_execute_ex 훅을 사용합니다. PHP 트레이서는 호출 스택이 512 프레임 깊이에 도달하면 경고를 출력해요. 이 경고는 환경 변수 DD_TRACE_WARN_CALL_STACK_DEPTH=0을 설정해 비활성화할 수 있어요.
호출 스택이 깊은 PHP 애플리케이션을 지원하려면 호스트 머신의 스택 크기 제한을 조정하세요. 기존 스택 크기를 보려면 다음을 실행하세요:
ulimit -s
예를 들어, 기존 스택 크기가 8192라면 새 스택 크기를 16384로 설정해 두 배로 늘릴 수 있어요.
sudo ulimit -s 16384