2026年9月2日
2026年9月2日
PHPのmax_execution_time・memory_limitの設定方法|確認・変更場所とタイムアウトの切り分け
max_execution_time は1回のリクエストでPHPが処理してよい時間、memory_limit は1回のリクエストで使ってよいメモリの上限です。どちらも「今どの値が効いているかを確認する」「自分の環境で効く場所(php.ini・PHP-FPMのプール設定・.user.ini など)で変える」「変えたあと再読み込みして値を確かめる」の順で進めると迷いません。この記事では、2つの設定の意味と既定値、環境別の変更方法、WordPressの WP_MEMORY_LIMIT との関係、そして値を上げても直らないタイムアウトの切り分けまでを説明します。
2つの設定が何を制限しているか
max_execution_time
PHPスクリプトの実行時間の上限を秒で指定します。既定値は30秒で、超えると次のようなエラーで処理が止まります。
PHP Fatal error: Maximum execution time of 30 seconds exceeded in /path/to/file.php on line 123
注意したいのは、LinuxなどWindows以外の環境では「スクリプト自身の実行時間」だけが数えられる点です。データベースの応答待ち、外部APIへの通信、sleep() などで待っている時間は含まれません(Windowsでは経過した実時間で数えられます)。そのため「外部APIの応答が遅くて画面が止まる」ケースでは、max_execution_time を上げても効果がないことがあります。
また、コマンドライン(CLI)で動かすPHPでは既定で0(無制限)です。WP-CLIやcronから実行するバッチ処理がWebでは止まるのにCLIでは最後まで動く、という差はここから来ています。
memory_limit
1回のリクエスト(またはCLIの1回の実行)が確保できるメモリの上限です。既定値は128Mで、超えると次のエラーになります。
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes)
134217728 bytes は128MBのことです。エラーに出ている数値を1024で2回割ると、今効いている上限が分かります。-1 を指定すると無制限になりますが、Webリクエストで無制限にすると、不具合のあるコードがサーバーのメモリを使い切ってほかのプロセスまで巻き込むおそれがあるため、上限は残しておきます。
この値は「サイト全体」ではなく「1プロセスあたり」の上限です。PHP-FPMで同時に20プロセスが動けば、最悪で memory_limit × 20 のメモリを使う可能性があります。値を大きくするときは、サーバーの搭載メモリとPHP-FPMの pm.max_children の組み合わせで考えます。
一緒に見直す関連設定
ファイルのアップロードやインポートで問題が出ている場合は、次の設定も関係します。
upload_max_filesize… 1ファイルあたりのアップロード上限post_max_size… POSTデータ全体の上限。upload_max_filesize以上にするmax_input_time… リクエストデータの受信・解析にかけてよい時間
PHPマニュアルでは、memory_limit は post_max_size より大きくしておくのが一般的とされています。
今効いている値を確認する
設定を変える前に、どのphp.iniが読み込まれ、どの値が効いているかを確認します。CLIとWebサーバー(PHP-FPMやApacheのモジュール)は別のphp.iniを読んでいることが多く、CLIで確認した値がWeb側と同じとは限りません。
# CLIが読み込んでいる設定ファイル
php --ini
# CLIで効いている値
php -i | grep -E 'max_execution_time|memory_limit'
Web側の値は、一時的に次のファイルをドキュメントルートに置いてブラウザで開くと確認できます。確認が終わったらすぐに削除してください。サーバーの内部情報が外部から見える状態になるためです。
<?php
// check-ini.php(確認後に削除する)
header('Content-Type: text/plain; charset=UTF-8');
echo 'php.ini: ' . php_ini_loaded_file() . PHP_EOL;
echo 'max_execution_time: ' . ini_get('max_execution_time') . PHP_EOL;
echo 'memory_limit: ' . ini_get('memory_limit') . PHP_EOL;
echo 'SAPI: ' . PHP_SAPI . PHP_EOL;
SAPI が fpm-fcgi ならPHP-FPM、apache2handler ならApacheのモジュール版(mod_php)、cgi-fcgi ならCGI/FastCGIで動いています。次の章で変更場所を選ぶときの手がかりになります。
WordPressなら、管理画面の「ツール」→「サイトヘルス」の「情報」タブにあるサーバーの項目でも、PHPのメモリ上限や実行時間の上限を確認できます(表示名はバージョンによって変わることがあります)。
環境別の変更方法
どこで設定するかは、PHPの動かし方とサーバーの管理権限で決まります。変更前には元の設定ファイルをコピーしてバックアップを取り、可能ならステージング環境で先に試してください。
php.iniを直接編集する(VPS・専用サーバー)
php --ini やWeb側の確認で分かったphp.iniを編集します。Debian/Ubuntu系では、CLI用とFPM用でファイルが分かれています(例: /etc/php/8.3/fpm/php.ini。パスはPHPのバージョンやディストリビューションで異なります)。
max_execution_time = 60
memory_limit = 256M
php.iniを変えただけでは反映されません。PHP-FPMなら再読み込み、mod_phpならApacheの再読み込みが必要です。サービス名は環境で異なるため、systemctl list-units | grep php で確認してから実行します。
sudo systemctl reload php8.3-fpm
PHP-FPMのプール単位で設定する
1台のサーバーで複数のサイトを動かしている場合、プール設定ファイル(例: /etc/php/8.3/fpm/pool.d/www.conf)でサイトごとに値を変えられます。
php_admin_value[memory_limit] = 256M
php_value[max_execution_time] = 60
php_admin_value で設定した値は、アプリケーション側の ini_set() で上書きできません。上限を管理者側で固定したいときに使います。php_value はアプリ側で変更できる初期値です。
.user.iniを使う(共有レンタルサーバーなど)
PHPがCGI/FastCGI(PHP-FPMを含む)で動いていてphp.iniを編集できない場合は、ドキュメントルートに .user.ini を置く方法があります。
memory_limit = 256M
max_execution_time = 60
.user.ini は既定で300秒(user_ini.cache_ttl)ごとに読み直されるため、反映まで数分かかることがあります。レンタルサーバーによっては独自のコントロールパネルからPHP設定を変える方式になっていて、.user.ini が無効にされている場合もあるので、事業者のマニュアルを確認してください。
.htaccessのphp_valueはmod_phpのときだけ
.htaccess に php_value memory_limit 256M と書く方法は、ApacheでPHPをモジュール(mod_php)として動かしているときだけ使えます。PHP-FPMやCGIで動いている環境に書くと、Apacheが解釈できずに500エラーになります。上で確認した SAPI が apache2handler でなければ使わないでください。
コードの中で一時的に変える
重い処理の直前だけ上限を変えたい場合は、ini_set() や set_time_limit() を使えます。
// この処理だけ上限を引き上げる(php_admin_valueで固定されていれば効かない)
ini_set('memory_limit', '512M');
set_time_limit(120); // 呼んだ時点から120秒に数え直す
set_time_limit() は呼び出した時点から計測をやり直す関数です。ループの中で毎回呼ぶと実質的に無制限になるため、使う場所は限定します。また、サーバーの設定で関数自体が無効化されている場合もあります。
WordPressのWP_MEMORY_LIMITとの関係
WordPressには独自の定数があり、wp-config.php で指定します。
// wp-config.php の「編集が必要なのはここまでです」より上に書く
define( 'WP_MEMORY_LIMIT', '256M' ); // 公開側(フロント)の上限
define( 'WP_MAX_MEMORY_LIMIT', '512M' ); // 管理画面の処理で使う上限
既定では、WP_MEMORY_LIMIT は単一サイトで40M(マルチサイトで64M)、WP_MAX_MEMORY_LIMIT は256Mです。WordPressはPHPの現在の上限がこれらより低いときだけ ini_set() で引き上げ、すでに高い場合は下げません。
つまり、PHP側が php_admin_value で128Mに固定されていれば、wp-config.php で256Mと書いても効きません。「wp-config.phpを書き換えたのにサイトヘルスの表示が変わらない」ときは、PHP側の設定を見直します。
値を上げても直らないときの切り分け
タイムアウトはPHPだけで起きるわけではありません。表示されるエラーで、どこの上限に当たっているかを見分けます。よくある順に挙げます。
**画面やログに Maximum execution time ... exceeded が出る**PHPの max_execution_time に当たっています。この記事の方法で値を上げるか、処理を分割します。
ブラウザに「504 Gateway Timeout」が出るnginxやロードバランサーなど、PHPの手前にあるサーバーが待ちきれずに接続を切っています。nginxなら fastcgi_read_timeout(既定60秒)が典型です。PHPの値だけ300秒にしても、手前が60秒で切れば504になります。
**ブラウザに「502 Bad Gateway」が出て、PHP-FPMのログに request_terminate_timeout や子プロセスの終了が記録されている**PHP-FPMのプール設定 request_terminate_timeout に当たって、プロセスが強制終了されています。0以外が設定されていると、max_execution_time より優先して処理を打ち切ります。
Apacheで「Timeout」や「proxy: error reading」系のログが出るApacheの Timeout や、mod_proxy_fcgi を使っている場合のプロキシ側のタイムアウトが関係しています。
レイヤーごとの値は、外側ほど長くなるように揃えます。たとえば「PHP 60秒、PHP-FPM 90秒、nginx 120秒」のようにしておくと、PHP自身のエラーメッセージが先に出てログで原因を追いやすくなります。
そもそも値を上げるべきか
上限を上げるのは応急処置です。毎回上限ぎりぎりまで使っているなら、次のような対策を検討します。
- 大量の投稿の一括処理やインポートは、Webリクエストではなく WP-CLI やcronで実行する(CLIは時間制限が無いため、途中で止まりにくい)
- 1回で全件を処理せず、100件ずつなどに分割して繰り返す
memory_limit超過が特定のプラグインの操作だけで起きるなら、そのプラグインのサポート情報や更新履歴を確認する- メモリを大量に使う画像処理は、サイズの大きな画像のアップロードを控えるなど入口で減らす
PHPのバージョンごとの既定値や挙動は変わることがあります(2026年10月現在)。サーバーのPHPを更新したときは、設定が引き継がれているか、この記事の確認方法でもう一度値を見ておくと安心です。
まとめ
max_execution_timeは実行時間(既定30秒、CLIは無制限)、memory_limitは1プロセスあたりのメモリ(既定128M)の上限- Linuxでは、DB待ちや外部通信の待ち時間は
max_execution_timeに含まれない - 変更前に
php --iniと、Web側のphp_ini_loaded_file()で読み込まれている設定ファイルを確認する - 変更場所はphp.ini、PHP-FPMのプール、
.user.ini、mod_phpなら.htaccess。変更後は再読み込みして値を確かめる WP_MEMORY_LIMITはPHP側の上限を超えては効かない- 504や502はPHPの手前のタイムアウト。nginx・PHP-FPM・Apacheの値を外側ほど長く揃える