현재 위치: > 최신 기사 목록> GetTrace 기능을 사용하여 PHP 예외 스택 정보를 얻을 때 모범 사례와 팁은 무엇입니까?

GetTrace 기능을 사용하여 PHP 예외 스택 정보를 얻을 때 모범 사례와 팁은 무엇입니까?

gitbox 2025-09-08

1. gettrace () 함수의 기본 사항

gettrace () 는 PHP의 던질 가능한 인터페이스의 일부입니다. 배열을 반환하고 배열의 각 요소는 예외가 발생할 때 스택의 프레임을 나타냅니다. 각 프레임에는 호출 파일, 줄 번호, 함수 이름, 매개 변수 등과 같은 기능 호출에 대한 자세한 정보가 포함되어 있습니다.

간단한 예 :

 <span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">'Something went wrong'</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getTrace</span></span><span>());
}
</span></span>

출력 결과는 다음과 유사합니다.

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [</span><span><span class="hljs-number">0</span></span><span>] =&gt; </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
        (
            [file] =&gt; /path/to/file.php
            [line] =&gt; </span><span><span class="hljs-number">12</span></span><span>
            [function] =&gt; someFunction
            [args] =&gt; </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
                (
                    [</span><span><span class="hljs-number">0</span></span><span>] =&gt; </span><span><span class="hljs-string">"argument"</span></span><span>
                )
        )
)
</span></span>

이 배열은 예외가 발생할 때 스택 정보를 보여줍니다. 각 요소에는 함수가 호출 될 때 파일 경로, 줄 번호, 함수 이름 및 매개 변수가 포함됩니다.


2. 스택 정보를 인쇄 할 때 출력을 형식화하십시오

스택 정보의 원래 출력이 더 길어질 수 있습니다. 특히 여러 기능 호출이 더 깊을 때. 쉽게보기 및 분석을 위해서는 일반적으로 스택 정보의 출력을 포맷해야합니다. print_r () 또는 var_dump ()를 사용하여 스택 정보를 출력하거나 재귀 함수 또는 기타 방법을 통해 더 친숙 할 수 있습니다.

예를 들어, 다음 코드는 재귀 함수를 통해보다 읽기 쉬운 형식으로 정보를 스택으로 인쇄합니다.

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">printTrace</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$trace</span></span></span><span>) {
    </span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$trace</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$index</span></span><span> =&gt; </span><span><span class="hljs-variable">$frame</span></span><span>) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"#<span class="hljs-subst">{$index}</span></span></span><span> </span><span><span class="hljs-subst">{$frame['file']}</span></span><span>(</span><span><span class="hljs-subst">{$frame['line']}</span></span><span>): ";
        </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$frame</span></span><span>[</span><span><span class="hljs-string">'class'</span></span><span>])) {
            </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">{$frame['class']}</span></span></span><span><span class="hljs-subst">{$frame['type']}</span></span><span>";
        }
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">{$frame['function']}</span></span></span><span>(";
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">implode</span></span><span>(</span><span><span class="hljs-string">', '</span></span><span>, </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(function(</span><span><span class="hljs-variable">$arg</span></span><span>) { </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">var_export</span></span><span>(</span><span><span class="hljs-variable">$arg</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>); }, </span><span><span class="hljs-variable">$frame</span></span><span>[</span><span><span class="hljs-string">'args'</span></span><span>]));
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">")\n"</span></span><span>;
    }
}

</span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">'Test Exception'</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-title function_ invoke__">printTrace</span></span><span>(</span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getTrace</span></span><span>());
}
</span></span>

이 출력 방법을 사용하면 스택 정보를 쉽게 이해할 수 있습니다. 특히 더 복잡한 응용 프로그램을 디버깅 할 때 문제를 신속하게 찾을 수 있습니다.


3. 전체 스택 정보 가져 오기 : gettraceasstring ()

gettrace () 함수는 배열을 제공하지만 때로는 더 컴팩트 한 문자열 형식이 필요하며, 이는 gettraceasstring () 함수를 사용하는 데 사용할 수 있습니다. 이 메소드는 스택 정보를 읽을 수있는 문자열로 변환하며 로그 파일로 쉽게 기록 할 수 있습니다.

 <span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">'An error occurred'</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getTraceAsString</span></span><span>();
}
</span></span>

출력은 다음과 유사합니다.

 <span><span><span class="hljs-selector-id">#0</span></span><span> /path/</span><span><span class="hljs-selector-tag">to</span></span><span>/file</span><span><span class="hljs-selector-class">.php</span></span><span>(</span><span><span class="hljs-number">15</span></span><span>): </span><span><span class="hljs-built_in">someFunction</span></span><span>()
#</span><span><span class="hljs-number">1</span></span><span> /path/to/file.</span><span><span class="hljs-built_in">php</span></span><span>(</span><span><span class="hljs-number">18</span></span><span>): </span><span><span class="hljs-built_in">anotherFunction</span></span><span>()
#</span><span><span class="hljs-number">2</span></span><span> /path/to/file.</span><span><span class="hljs-built_in">php</span></span><span>(</span><span><span class="hljs-number">22</span></span><span>): </span><span><span class="hljs-built_in">mainFunction</span></span><span>()
</span></span>

이 형식은 특히 오류 로그에서 완전한 스택 정보를 기록하는 데 특히 적합하며 후속 오류 분석을 용이하게합니다.


4. 스택 깊이 제어

복잡한 응용 분야에서 스택 정보는 특히 스택 깊이가 깊을 때 매우 클 수 있습니다. 너무 큰 스택 정보를 출력하지 않으려면 스택 깊이를 제어하여 가장 중요한 스택 프레임 만 출력 할 수 있습니다.

예를 들어:

 <span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">'Another test exception'</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-variable">$trace</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_slice</span></span><span>(</span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getTrace</span></span><span>(), </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>);  </span><span><span class="hljs-comment">// 처음 3 개의 스택 프레임 만 출력됩니다</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$trace</span></span><span>);
}
</span></span>

이러한 방식으로 개발자는 정보 과부하를 피하기 위해 스택의 처음 몇 가지 중요한 프레임 만 볼 수 있습니다.


5. 로깅 도구와 결합

로그 스택 정보 로그 로그 파일에 로깅은 일반적인 디버깅 요구 사항입니다. 생산 환경에서 PHP 개발자는 일반적으로 로깅 도구 (예 : 독백 )를 결합하여 후속 분석을위한 예외 스택 정보를 기록합니다.

예를 들어 독백을 결합하여 스택 정보를 기록합니다.

 <span><span><span class="hljs-keyword">use</span></span><span> </span><span><span class="hljs-title">Monolog</span></span><span>\</span><span><span class="hljs-title">Logger</span></span><span>;
</span><span><span class="hljs-keyword">use</span></span><span> </span><span><span class="hljs-title">Monolog</span></span><span>\</span><span><span class="hljs-title">Handler</span></span><span>\</span><span><span class="hljs-title">StreamHandler</span></span><span>;

</span><span><span class="hljs-variable">$log</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">Logger</span></span><span>(</span><span><span class="hljs-string">'exception_log'</span></span><span>);
</span><span><span class="hljs-variable">$log</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">pushHandler</span></span><span>(</span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">StreamHandler</span></span><span>(</span><span><span class="hljs-string">'path/to/logfile.log'</span></span><span>, </span><span><span class="hljs-title class_">Logger</span></span><span>::</span><span><span class="hljs-variable constant_">ERROR</span></span><span>));

</span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">'Logging exception'</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-variable">$log</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">error</span></span><span>(</span><span><span class="hljs-string">'Exception occurred'</span></span><span>, [</span><span><span class="hljs-string">'exception'</span></span><span> =&gt; </span><span><span class="hljs-variable">$e</span></span><span>]);
}
</span></span>

이러한 방식으로 예외 스택 정보는 더 쉽게 추적 및 분석을 위해 로그 파일에 녹화 할 수 있습니다.


6. 사용자 정의 예외 클래스를 사용하십시오

경우에 따라 PHP의 내장 예외 클래스를 사용하면 충분히 유연하지 않을 수 있습니다. 스택 정보를 더 잘 관리하기 위해 개발자는 사용자 정의 예외 클래스를 생성하고 필요에 따라 gettrace () 의 기능을 확장 할 수 있습니다. 예를 들어, 특정 컨텍스트 정보가 기록되거나 스택 정보가 특정 형식으로 형식화 될 수 있습니다.

 <span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">MyCustomException</span></span><span> </span><span><span class="hljs-keyword">extends</span></span><span> </span><span><span class="hljs-title">Exception</span></span><span> {
    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">getCustomTrace</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
        </span><span><span class="hljs-variable">$trace</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getTrace</span></span><span>();
        </span><span><span class="hljs-comment">// 사용자 정의 로직을 여기에 추가 할 수 있습니다,예를 들어, 더 많은 컨텍스트 정보를 기록하십시오</span></span><span>
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$trace</span></span><span>;
    }
}

</span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">MyCustomException</span></span><span>(</span><span><span class="hljs-string">'Custom exception occurred'</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (MyCustomException </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getCustomTrace</span></span><span>());
}
</span></span>

사용자 정의 예외 클래스는 코드를 더욱 확장 가능하게 만들고 필요할 때보다 구체적인 스택 정보 또는 처리 로직을 추가 할 수 있습니다.


7. 성능과 민감한 정보에주의를 기울이십시오

gettrace () 는 매우 유용한 디버깅 도구이지만 생산 환경에서 스택 정보를 자주 출력하면 특히 동시 시스템에서 성능 문제가 발생할 수 있습니다. 따라서 개발자는 특히 민감한 정보 (예 : 데이터베이스 비밀번호, 사용자 데이터 등)에 대한 스택 정보의 과도한 기록을 피하기 위해 제작 환경에서주의를 기울여 사용 하고이 정보가 유출되지 않도록해야합니다.

일반적인 관행은 환경에 따라 자세한 스택 레코드를 활성화할지 여부를 결정하는 것입니다.

 <span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">getenv</span></span><span>(</span><span><span class="hljs-string">'APP_ENV'</span></span><span>) !== </span><span><span class="hljs-string">'production'</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getTraceAsString</span></span><span>();
}
</span></span>

생산 환경에서는 시스템 성능과 보안을 향상시키기 위해 일반적으로 잘못된 정보 만 기록됩니다.