PHPでできたCMSのプログラムのファイルアップロード機能でアップロード出来ない場合。
疑う箇所が幾つかあります。
php.iniの設定
upload_max_filesize 設定
このサイズを超えるファイルはエラーになります。アップロードされたファイルは一時的に、/tmpに置かれます。*1
post_max_size
post_max_size で HTTP POSTで送信できる(PHPが受信できる)パケットサイズの最大値を制限している。ファイルアップロードもHTTPのPOSTを使うので、post_max_sizeも関係する。
MySQLにファイルを保存している場合
稀にあるのがMySQLにBlob型でファイルを保存するCMS。これらのCMSはMySQLにファイルを放り込むため、MySQLの制限に引っかかるおそれがある。MySQLはSQLの最大サイズを規定している。それゆえ、ファイル(BLOB)が含まれ、巨大になったSQLを受け付けない。サイズを大きめ似とる必要がある。
MySQLにファイル保存中身する場合もあるのですが、この場合は気づかずにハマりがち
/tmpのファイル容量。
/tmpのファイル容量は普段気にしないが、頻繁にアップロードする環境でHDDに次々ファイルが貯まっている。/tmpは再起動すれば消えるので、/tmpのファイルサイズも念頭に置いておくべきかと思う。
レンタルサーバーなどの場合、/tmpが使えずにCMSのディレクトリ階層中にファイルが置かれる。そのためレンタルサーバーのディスク制限を食いつぶす可能性がある。
ちゃんとしたCMSなら使い終ったファイルを/tmpから消してくれます。ですが、実行エラーが起き消せずに残る場合が頻出します。たとえば、max_execution_time制限によるタイムアウトや、MySQLのmax_allowd_packet 制限にかかった場合、ファイルを消す処理が実行されずにエラーによりPHP実行停止する。結果、ファイルが消されずにゴミが残り続けることになる。
などなど、ファイルアップロードはPHPでとても簡単に扱えるが、まともに向き合うととってもめんどくさかったりしますね。
2016-07-21
追記