Appearance
API-001-7 パフォーマンス計測
概要
日別記事テンプレート(DailyArticleTemplateController)実行をプロファイリングし、クエリ数・実行時間・メモリ・出力長などを JSON で返す開発・管理者向けエンドポイント。同機能のショートコードは SC-011。
入力(リクエスト)
register_route に args は定義しない。コールバック内でソフト読取する。
| param | 必須 | 型・制約 | 説明 |
|---|---|---|---|
date | いいえ | 指定時は YYYY-MM-DD。省略時は最新日付 | 計測対象日(LinkDayRepository::get_latest_date() フォールバック) |
halls | いいえ | カンマ区切り文字列。省略時は下記デフォルト | 計測対象ホール。既定: アイランド秋葉原,エスパス秋葉原 |
出力(レスポンス)
成功時 data
| field | 型 | 説明 |
|---|---|---|
success | boolean | 常に true |
parameters | object | { date: string, halls: string }(適用された計測条件) |
performance | object | query_count / execution_time / memory_usage / memory_usage_mb |
output_length | int | テンプレート出力(ショートコード展開後)のバイト長 |
performance.top_5_queries(SQL 文と実行時間の上位 5 件)はローカル環境、または manage_options のときのみ付与。Local バイパス以外は manage_options 必須のため実質「管理者と Local 開発」限定であり、追加のデバッグフラグは設けない(Issue #3867 で判断)。
HTTP ステータス: 200
失敗・エラー条件
| 条件 | レスポンス形式 |
|---|---|
date 形式不正 | { "success": false, "error": { "message": "..." } }(400) |
| nonce なし・不正 | WordPress REST 標準(403)。Cookie 認証のみ |
| 権限不足 | WordPress REST 標準(403) |
| レート制限超過 | WordPress REST 標準(429) |
| サーバー内部エラー | { "success": false, "error": { "message": "..." } }(500) |
権限・nonce
名前空間共通事項は API-一覧 を参照。本エンドポイントは PerformanceMeasurementHandler + WordPressPerformanceMeasurementPermissionChecker を使用する(Issue #3867)。
| 認証経路 | nonce(wp_rest) | capability |
|---|---|---|
| Cookie 認証(ブラウザ) | 必須(X-WP-Nonce ヘッダーか _wpnonce) | manage_options |
アプリケーションパスワード(rest_get_authenticated_app_password() が非 null) | 不要 | manage_options |
Local バイパス(LocalRestBypassGuard) | 不要 | 省略 |
- アプリケーションパスワードは Cookie を使わないため CSRF の前提が無く、nonce を発行・送信する手段も無い。そのため nonce は求めず、
manage_optionsとレート制限で守る。 - Local バイパスは
scripts/run-performance-test.sh(未ログインの curl)用。条件はLocalRestBypassGuardの PHPDoc を参照。
レート制限
3 経路すべてに BotRestRateLimiter(Transient の固定ウィンドウ)で次の上限をかける。超過時は 429。カウンタを保存できないときは拒否する(重い処理のため fail-closed)。
| 単位 | 上限 | バケット名 |
|---|---|---|
| ログインユーザー(ID > 0 のとき) | 60 秒に 10 回 | performance-measurement:user |
| クライアント IP | 60 秒に 20 回 | performance-measurement:ip:<IP> |
クライアント IP は RestClientIpResolver(USE_CLOUDFLARE_IP / TRUSTED_PROXY_HEADER / REMOTE_ADDR の順)で決める。Transient の get / set は原子的でないため、高並行時は上限をわずかに超えることがある。