PHP の Yii1.1 のシステムで大量レコード更新ができない問題を解決!max_input_vars の落とし穴
はじめに
PHP の Yii1.1 のシステムで、フォームから複数レコードをまとめて更新しようとしたところ、「30行以上のレコードを追加できない」という現象に遭遇しました。
一見システムのバグのように見えますが、原因は PHP の設定にありました。今回はその原因と解決方法をまとめます。
現象
-
フォームで複数レコードをまとめて登録・更新できる画面があります。
-
しかし、30行以上を追加して保存しようとすると、後半のレコードが反映されない。
-
エラーメッセージは特に出ませんが、追加されたレコードは一部だけです。
原因の調査
PHP には、フォームから送信される input の総数に制限があります。
-
1 行あたりの input 数 × 行数 がこの上限を超えると、PHP はそれ以降の input を無視します。
-
PHP の Yii1.1 のシステムでは、
CActiveForm
やパーシャルビューで多数の input を送信している場合、この制限に引っかかりやすくなります。
例えば:
行数 | 1行あたり input 数 | 合計 input 数 |
---|---|---|
30 | 40 | 1200 → 1000 を超える |
このように、30行以上送信すると max_input_vars
に引っかかり、後半のデータが無視されてしまいました。
解決方法
-
max_input_vars の増加
php.ini
を開き、値を増やします。
-
Apache / Nginx + PHP-FPM の場合は、設定変更後に再起動が必要です。
-
確認方法
-
これで 30行以上のレコードも正常に保存・更新できるようになりました。
注意点
-
post_max_size
が小さい場合も POST データが途中で切れることがありますが、今回のケースでは 2G に設定されており問題ありませんでした。 -
1行あたりの input 数が非常に多い場合は、max_input_vars を必要以上に大きくしないよう注意してください。
まとめ
-
PHP の Yii1.1 のシステムで複数レコードをまとめて保存・更新する場合、PHP の max_input_vars 制限 に注意が必要です。
-
デフォルト 1000 では 30行前後で制限に引っかかることがあります。
-
php.ini で max_input_vars を増やすと解決します。
💡 ポイント
大量のデータをフォームから送信する場合は、post_max_size
と max_input_vars
の両方を確認することがトラブル防止につながります。
コメント
コメントを投稿