PHPエラー「PHP Warning: Maximum number of allowable file uploads has been exceeded in Unknown on line 0」の原因と解決方法
PHPでファイルのアップロードを行う時に、
PHP Warning: Maximum number of allowable file uploads has been exceeded in Unknown on line 0
といったエラーが出てアップロードができない時がある。
このエラーの原因は、php.iniで設定できるmax_file_uploadsの値に問題があるので、max_file_uploadsを適切な値に変更することで問題が解決する。
まずは、このような場合、phpinfoでmax_file_uploadsを確認する。
max_file_uploadsで設定されている数値は、PHPでファイルを同時に何ファイルまでアップロードできるか、という最大値となる。
Webページ内にファイルの登録欄を30個設けていて、それらを1回のsubmitで処理しようとするのであれば、max_file_uploadsは30以上の数値になっている必要がある。
もし、max_file_uploadsの設定を20にしてファイルを30個登録しようとしたら、ファイルのうち20個までは登録に成功し、21個目以降の登録に失敗する、ということになってしまう。
max_file_uploadsの数値を変更するには、php.iniを編集することになる。
30に設定したい場合は、php.iniでは
max_file_uploads = 30
と指定する。(設定を反映するにはApacheの再起動が必要。)
CentOS 5でパッケージインストールしたPHP5.1.6のphp.iniなど、php.iniの中にmax_file_uploadsの記述がない場合は、「max_file_uploads = 数値」を新規に追加することになる。
max_file_uploadsのデフォルト(初期値)は20になっているようなので、max_file_uploadsの設定を知らなければ、「PHPではファイルが20個までしか登録できない。21個以上登録できない。何故だろう。」と悩むことになってしまう。(私も昔困ったことがあった。最近、困っている人を見かけたので、この設定のことを思い出した。)
PHPのマニュアルを参照すると、PHP 5.3.4以降に仕様が変わったことが書いてあり、少し面白い、と思った。
《参考》「コア php.ini ディレクティブに関する説明」
http://php.net/manual/ja/ini.core.phpmax_file_uploadsinteger
同時にアップロードできるファイルの最大数。 PHP 5.3.4 以降、何もファイルを指定せずに送信されたアップロードフィールドは ファイル数に数えられなくなりました。
これまでは、ファイルアップロード欄(アップロードフィールド)の数とmax_file_uploadsの数を一致させる、という意識を持ちやすかったのだが、上記の仕様に変わると、そのような意識を持つ人が減るかもしれない。
もし、ファイルアップロード欄(アップロードフィールド)が21個以上あるが、いつも使うのは20個以内、そしてファイルアップロード欄の最大数でのファイル登録テストをしなかった、というような場合、max_file_uploadsの数値を本来は30にしておかないといけないのに、デフォルトの20のままで長期間運用してしまい、ある日、21個以上登録する機会がやってきた時に「登録できない」と困ることがありそうだ。・・・と言ったことを考えつつも、PHP5.1.6でも結局同じことで困っている人をよく見かけるので、上記の仕様変更により、かえって困る人が増える、ということはないのかもしれない。