現在の位置: ホーム> 最新記事一覧> 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>

生産環境では、システムのパフォーマンスとセキュリティを改善するために、通常、誤った情報のみが記録されます。