Số lượng parameters trong mỗi lần gửi bằng POST giới hạn là 1000

Để ý khi gửi dữ liệu bằng post, số lượng parameters ko được quá 1000. Nếu quá thì có thể dùng htaccess để thay đổi đối với chính thư mục đang sử dụng.

PHP+PostgreSQLで構築したEC系のシステムで、受注500件分の納品書をPDF出力しようとしたら、273件分しか出力されないというような、妙なバグが出た。273件以下の場合は正常に出力される。

こんな中途半端な数字で処理が止まるようなことは考えにくいのだが、いろいろパラメータを変えてテストしても273件以上か未満かが境界になってることは間違いなさそう。

データをPOSTする側の画面Aと、POSTされたデータを受け取ってPDFを出力する側の画面BでPOSTの中身を見てみると、画面Bに273件しかデータが渡されていなかった。

メモリ、実行時間の制限には引っかかっていなそうだし、そういう挙動でも無いが、なにかが足切りされている感じがしたので、「POST 上限 php」で検索したところ、わりとあるあるネタだったようだ。

下記URLに記載の通り、1回でPOSTできるデータの数はデフォルトで1000件に設定されている。(PHP 5.3.9 以降)
http://php.net/manual/ja/info.configuration.php

max_input_vars integer 入力変数 を最大で何個まで受け付けるかを指定します (この制限は、スーパーグローバル $_GET、$_POST そして $_COOKIE にそれぞれ個別に適用されます)。 このディレクティブを使うと、ハッシュの衝突を悪用したサービス不能攻撃を受ける可能性を軽減できます。 このディレクティブで設定した数を超える入力変数があった場合は E_WARNING が発生し、 それ以降の入力変数はリクエストから削除されます。

確かに、フォームの数が1000超えてましたわ。

プログラム実行時にmax_input_varsの設定値を変える方法が無いようなので、該当ディレクトリに .htaccess を置いて対応した。

原因突き止めるまで結構かかってしまったんだけど、後から見返してみると、Apacheのログにバッチリ原因が出てたんですね。反省。

[Thu Oct 02 11:20:10 2014] [error] [client 127.0.0.1] PHP Warning:Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in Unknown on line 0, referer: http://hogehogehoge/hoge.php

とりあえずアホのようにログを見る、という超基本的な動作をおろそかにしてはならぬ(戒)

Bài viết liên quan