🌵
Laravelで大量のリクエストパラメータを送るときにFormRequestはやめたほうがいい話
概要
業務で一括処理を行っているAPIに対して、配列・JSONで数千件のパラメータを送りつけると、何かとても遅かった
(Laravel 9.4で確認)
原因
FormRequestで、配列パラメータに対してアスタリスク指定の検証があると遅い。
対象4,000件で、検証だけで2分以上かかる
[
'key.*.value' => 'required|boolean',
]
原因として、計算がn^nになるとのこと。Laravel10以降でも問題解消しないらしい
そうはいっても配列パラメータに対してアスタリスクは使いたい
対策
バリデーションライブラリのRespect\Validation\Validatorを導入する
composer.json
"respect/validation": "^2.3",
これのよいところは、配列の何行目でエラーになったかをFormRequestと同じく検知できるところ。
他でもできるかもしれないですが、ドキュメントで把握できたのがこちらだったのでこちらを採用
こんなイメージで検証可能
$validators = [
'coustomer_id' => v::intVal(),
'name' => v::stringType()->length(null, '20')
];
foreach ($targets as $index => $row) {
foreach ($validators as $key => $validator) {
$value = $row[$key] ?? null;
try {
$validator->assert($value);
} catch (ValidationException $e) {
// エラーメッセージ登録
$errors[] = $this->getErrorMessage(
$key,
$index + 1
);
}
}
}
結果
対処前
対処後
大幅に速度改善できました
既存のFormRequestを生成AIに渡せば、よしなに置換・実装してくれるので
こういう問題があると知っておくだけでも良さそうです
Discussion