RRelayer
ホーム/開発

プロファイラ#

APP_ENV=dev のとき、リクエストのライフサイクルがコンテナ束縛のプロファイラに記録されます。

  • AppRouter がディスパッチの各イベントを直接記録します。/_profiler

の Web ビュー自身もディスパッチの前段で AppRouter が横取りして応答するので、プロファイラ自身はプロファイルされません。

  • EtagStore / SessionStorage / Database / Authenticator

トレーサブルデコレータに差し替わり、cache.* / session.* / クエリ / 認証イベントがタイムラインに並びます。

  • 記録は var/cache/profiler に保存されます。

本番(APP_ENV が dev 以外)では ProfilerNullProfiler に解決され、ユーザーコードが Profiler 依存を取ってもコストはありません。 Traceable* クラスはオートロードすらされません。AppRouter には本番ではプロファイラが wire されず、各ディスパッチフックは単純な null チェックに畳まれるのでホットパスにオーバーヘッドはありません。

自前コードを計測(measure())#

自前の処理や三者ライブラリをタイムラインに乗せたいとき、専用の Traceable* デコレータを書かずに 呼び出し箇所をラップ できます。

public function render(PageContext $ctx, Profiler $profiler): Element
{
    $rows = $profiler->measure('report', 'aggregate', fn () => $this->report->build());

    return <Table rows={$rows} />;
}

measure(string $collector, string $label, callable $fn): mixed$fn を実行して戻り値をそのまま返し、$collector/$label の下に 所要時間だけ を記録します(手動 stop() 不要)。$fn が例外を投げても error ペイロード付きで span を記録してから例外をそのまま再送出します。

  • 記録するのは時間のみ。引数も戻り値も記録しません(汎用ラッパは

何が機微か判断できないため。サニタイズした値を残したいなら start() + TraceSpan::stop() を直接使い、安全なものだけ渡す)。

  • 本番(NullProfiler)でも $fn は実行され値/例外はそのまま素通り。

記録だけがスキップされます= Profiler 依存を残したまま無コスト。

除外パス#

ノイズになるパスは環境変数で除外できます。

PROFILER_EXCLUDED_PATHS=/_profiler,/assets,/favicon.ico

カンマ区切りで、前方一致のプレフィックスとして扱われます。

データのクリア#

var/cache/profiler に溜まった記録は専用コマンドで消せます。 /_profiler をまっさらな状態から見たいときに使います。

vendor/bin/relayer profiler:clear
  • 削除するのは var/cache/profiler/*.json(プロファイラが書く形式)

だけ。ディレクトリ自体やそこに置いた他のファイルは残します(dev の次のリクエストでディレクトリは作り直されます)。

  • 冪等で安全 — キャッシュディレクトリが無い/空でも「消すものなし」

の成功として終了します。再実行も常に安全。

  • 削除できないファイルがあればその旨を報告し、終了コードは 1

(サイレントな部分削除はしません)。成功時は 0

ルートの一覧#

プロファイラとは別に、検出済みルートはコマンドで確認できます。

vendor/bin/relayer routes
最終更新: 2026-05-21
変更履歴 (5)
  • v0.22.0: DispatchListener seam を撤去し AppRouter にプロファイラ直結化したため拡張節を削除+本文の現在形化
  • v0.21.0 TraceableAppRouter → ProfilingListener、DispatchListener 拡張点セクション追加
  • カテゴリを「運用」→「開発」へ移動
  • バージョン差分表記(vX.Y.Z 追加/破壊的変更/依存バージョン注記)を削除し現在形に整理
  • 新規作成