본문 바로가기
WIKI 기술 지식 베이스

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

더 알아보기 (Learn more)