HOWTO · PHP

PHP での最大アップロードサイズ

今日の記事では、PHP での最大アップロードサイズについて説明します。

このページの内容

より大きなアップロードを受け付けるには、PHPのファイル単位の上限 upload_max_filesize を引き上げ、リクエスト全体を収められるよう post_max_size を設定します。まず、アップロードを処理するプロセスで使われているPHP設定を特定し、その設定を変更したうえで、同じプロセスから値を確認してください。設定ファイルの場所や再読み込みの手順は、PHPのインストール方法やホスティング環境によって異なります。

実際に使われているPHP設定を確認する

PHPは php.ini から設定を読み込めます。コマンドラインPHPが使うファイルは、WebサーバーやPHP-FPMが使うファイルと異なることがあります。アップロードを受け取るPHPプロセスの設定を確認してください。コマンドラインPHPでは、php --ini を実行すると読み込まれた設定ファイルが表示されます。Webリクエストの場合は、一時的なスクリプトで php_ini_loaded_file() を呼び出すと、読み込まれたファイルを特定できます。設定情報を公開したままにしないよう、確認後はそのスクリプトを削除してください。

php.ini には通常、PHPのインストール環境や実行環境の設定が記述されています。Webサーバーの構成によっては、.htaccess を使ってディレクトリ単位で設定を上書きできますが、利用できるかどうかはサーバーとPHPの連携方法によります。PHP自体が .htaccess を提供しているわけではなく、ホスト側で上書きが無効にされている場合もあります。該当するファイルやサービスを自分で管理できない場合は、ホスティングのコントロールパネルを使うか、管理者に変更可能な設定を確認してください。

upload_max_filesize を設定する

このディレクティブは、アップロードする個々のファイルのサイズを制限します。有効な設定を編集し、受け付ける最大ファイルに合った値を指定してください。たとえば、upload_max_filesize = 32M とすると、ファイル単位の上限は32メガバイトになります。PHPのサイズ指定では通常 K、M、G を使います。PHPの設定とホストでサポートされる値を選んでください。例の値が現在の既定値だとは限りません。また、値を変更してもサーバー上のすべてのPHP実行環境に反映されるとは限りません。

リクエスト全体に対する post_max_size を設定する

post_max_size は、multipartフォームデータやリクエスト内のほかのファイルを含め、HTTPリクエスト本文全体のサイズを制限します。フォーム項目やmultipartの付加データを収める余裕を持たせ、upload_max_filesize より大きな値にしてください。たとえば、ファイルの上限が32メガバイトなら、リクエストの上限を 40M にすると余裕ができます。リクエストの上限が小さすぎると、ファイル自体が upload_max_filesize 未満でも、PHPからアプリケーションにアップロードファイルが渡されないことがあります。memory_limit は、この2つの設定に対する必須の上限ではありません。必要なメモリ量は、アプリケーションがアップロードをどう処理するかによって異なります。

変更を反映する

アップロードを受け取るPHPプロセスに適用される設定ファイルまたは上書き設定を保存します。ホストによっては変更がすぐ反映されますが、Webサーバー、PHP-FPM、その他のPHPサービスの再読み込みや再起動が必要な場合もあります。ホスティング環境の手順に従ってください。新しいコマンドを実行する場合、コマンドラインPHPを再起動する必要はありませんが、長時間稼働するサービスは再読み込みが必要なことがあります。共有ホスティングでは、サーバー上のファイルを編集する代わりに、コントロールパネルで値を変更する必要がある場合があります。

反映された上限を確認する

アップロードを処理する環境と同じ環境で、両方の値を確認してください。短いPHPスクリプトを使うと、そのプロセスで認識されている値を表示できます。

次の例は単体で使える構成ですが、このパケットでは実行確認されていません。コード例が表示するディレクティブ名は英語表記のままです。
このセクションのコードと表示されるラベルや出力は英語のままです。

<?php
foreach (['upload_max_filesize', 'post_max_size'] as $name) {
    echo $name, '=', ini_get($name), PHP_EOL;
}

Webの設定を確認するには、該当するWeb実行環境を通してスクリプトを実行してください。ターミナルで実行すると、コマンドラインPHPの設定が確認されます。確認が済んだら、一時的な診断ページを削除してください。表示された値が変わっていない場合は、読み込まれている設定ファイルを編集したか、正しいサービスに変更を反映したかを確認してください。

アップロードに失敗する場合のトラブルシューティング

アップロードが拒否された場合は、ファイルサイズを upload_max_filesize と、リクエスト全体のサイズを post_max_size と比較してください。「アップロードされたファイルが upload_max_filesize ディレクティブの上限を超えています(設定ファイル: php.ini)」のようなエラーは、ファイル単位のPHP上限を示しますが、文言は環境によって異なることがあります。表示される上限が低いままなら、読み込まれているファイルと、該当するサービスが再読み込みされたかを確認してください。PHPが意図した値を報告している場合は、Webサーバー、プロキシ、ホスティング基盤、アプリケーションのルールなど、別の層がより低い上限を課している可能性があります。その層の設定やログを確認し、上限を変更できない場合はホストに問い合わせてください。リクエストの上限はファイルの上限より大きく保ち、実際のアップロードを処理するものと同じ経路およびPHP実行環境で再テストしてください。