それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

PHPのファイルアップロードが出来ない場合に見直すphp.ini設定項目

PHPでできたCMSのプログラムのファイルアップロード機能でアップロード出来ない場合。

疑う箇所が幾つかあります。

  1. CMS側のアップロード設定
  2. php.ini の upload_max_filesize
  3. php.ini の max_execution_time
  4. php.ini の post_max_size
  5. mysql の max_allowed_packet
  6. /tmp に置けるファイルのサイズ(HDDの残り容量)

CMSのアップロード設定

CMS側で ini_set を使い、php.iniを書き換えている可能性があるので、CMSの アップロード設定をじっくり見直す。

php.iniの設定

upload_max_filesize 設定

このサイズを超えるファイルはエラーになります。アップロードされたファイルは一時的に、/tmpに置かれます。*1

post_max_size

post_max_size で HTTP POSTで送信できる(PHPが受信できる)パケットサイズの最大値を制限している。ファイルアップロードもHTTPのPOSTを使うので、post_max_sizeも関係する。

max_execution_time

ApachePHPを実行する時間に関する設定。レンタルサーバーなどで長時間の処理をずっとさせないために、この設定が使われていたり、PHPプログラマのスキルを考えて、無限ループが起きても、PHP自死することで暴走を止める安全弁。この設定にも注意が必要。

ファイルの転送に時間がかかると、max_execution_time設定によりPHP自死するので注意が必要。*2

MySQLにファイルを保存している場合

稀にあるのがMySQLにBlob型でファイルを保存するCMS。これらのCMSMySQLにファイルを放り込むため、MySQLの制限に引っかかるおそれがある。MySQLSQLの最大サイズを規定している。それゆえ、ファイル(BLOB)が含まれ、巨大になったSQLを受け付けない。サイズを大きめ似とる必要がある。

MySQLにファイル保存中身する場合もあるのですが、この場合は気づかずにハマりがち

/tmpのファイル容量。

/tmpのファイル容量は普段気にしないが、頻繁にアップロードする環境でHDDに次々ファイルが貯まっている。/tmpは再起動すれば消えるので、/tmpのファイルサイズも念頭に置いておくべきかと思う。

レンタルサーバーなどの場合、/tmpが使えずにCMSディレクトリ階層中にファイルが置かれる。そのためレンタルサーバーのディスク制限を食いつぶす可能性がある。

ちゃんとしたCMSなら使い終ったファイルを/tmpから消してくれます。ですが、実行エラーが起き消せずに残る場合が頻出します。たとえば、max_execution_time制限によるタイムアウトや、MySQLのmax_allowd_packet 制限にかかった場合、ファイルを消す処理が実行されずにエラーによりPHP実行停止する。結果、ファイルが消されずにゴミが残り続けることになる。



などなど、ファイルアップロードはPHPでとても簡単に扱えるが、まともに向き合うととってもめんどくさかったりしますね。

2016-07-21

追記

*1:CMS側でファイル置き場を変えている場合もある。殆どの場合/tmp

*2:正確にはHTTP POSTの解析に時間がかかったりファイルの移動や変換に時間が必要になっていたりすることなのですが。