PHPのメモリ上限とは、1つのPHPスクリプトが使用できるメモリ量の最大値のことです。
PHPでは、この上限を memory_limit という設定項目で管理します。
設定された上限を超えてメモリを使用しようとすると、次のようなエラーが発生します。
Fatal error: Allowed memory size of 134217728 bytes exhausted
このエラーは、PHPが使用できるメモリ量を使い切ったことを意味します。
たとえば 134217728 bytes は約128MBなので、PHPのメモリ上限が 128M に設定されている可能性があります。
WordPress、ECサイト、大量データ処理、画像処理、バックアップ処理などでは、PHPのメモリ上限が不足してエラーになることがあります。
その場合は、環境に合わせて memory_limit の値を変更する必要があります。
PHPのメモリ上限を確認する方法
PHPのメモリ上限を変更する前に、まず現在の設定値を確認しましょう。
現在の値を把握しないまま変更すると、設定が反映されたかどうか判断できません。
また、Webサーバー経由のPHPとコマンドラインのPHPでは、読み込んでいる設定ファイルが異なる場合があります。
PHPファイルで確認する
もっとも簡単な確認方法は、PHPファイルを作成して ini_get() で確認する方法です。
以下のようなファイルを作成します。
<?php
echo ini_get('memory_limit');
たとえば check-memory.php という名前で保存し、サーバーにアップロードしてブラウザからアクセスします。
表示例は以下の通りです。
128M
確認が終わったら、このファイルは必ず削除してください。
サーバー設定に関する情報を外部に公開したままにすると、セキュリティ上好ましくありません。
phpinfoで確認する
より詳しく確認したい場合は、phpinfo() を使います。
<?php
phpinfo();
このファイルをブラウザで開き、ページ内検索で memory_limit を探します。
表示例は以下のようになります。
memory_limit 128M 128M
phpinfo() では、PHPのバージョン、読み込んでいる設定ファイル、各種設定値なども確認できます。
ただし、phpinfo() はサーバー情報を広範囲に表示するため、確認後は必ず削除してください。
コマンドラインで確認する
SSHが使える環境では、コマンドラインから確認することもできます。
php -i | grep memory_limit
または、以下のコマンドでも確認できます。
php -r "echo ini_get('memory_limit') . PHP_EOL;"
ただし、コマンドラインで確認できる値は、CLI版PHPの設定です。
Webサイトで実行されるPHPとは、別の php.ini を読み込んでいる場合があります。
そのため、WebサイトでのPHPメモリ上限を確認したい場合は、ブラウザ経由で phpinfo() や ini_get() を使って確認するのが確実です。
PHPのメモリ上限を変更する主な方法
PHPのメモリ上限を変更する方法は、環境によって異なります。
主な変更方法は以下の通りです。
php.iniで変更する
PHPのメモリ上限を変更する基本的な方法は、php.ini を編集する方法です。
php.ini に以下のように記述します。
memory_limit = 256M
よく使われる設定値は以下です。
memory_limit = 128M
memory_limit = 256M
memory_limit = 512M
memory_limit = 1024M
無制限にする場合は、以下のように指定します。
memory_limit = -1
ただし、本番環境で -1 を指定するのは基本的におすすめできません。
PHPスクリプトに不具合がある場合、サーバーのメモリを大量に消費し、サイト全体やサーバー全体が不安定になる可能性があります。
通常は、まず 256M または 512M 程度に設定するのが現実的です。
php.iniの場所を確認する
php.ini の場所は環境によって異なります。
SSHが使える場合は、以下のコマンドで確認できます。
php --ini
表示例は以下の通りです。
Loaded Configuration File: /etc/php/8.2/cli/php.ini
ただし、このコマンドで表示されるのはCLI版PHPの設定ファイルである場合があります。
Webサーバー経由で使われるPHPの設定ファイルは、以下のような場所にあることがあります。
/etc/php/8.2/apache2/php.ini
/etc/php/8.2/fpm/php.ini
/etc/php/8.1/apache2/php.ini
/etc/php/8.1/fpm/php.ini
/usr/local/etc/php/php.ini
ApacheでPHPを動かしているのか、NginxとPHP-FPMで動かしているのかによって、編集すべきファイルが変わります。
設定変更後は再起動する
php.ini を変更した場合、WebサーバーやPHP-FPMの再起動が必要になることがあります。
Apacheの場合は、以下のように再起動します。
sudo systemctl restart apache2
CentOS系などでは、以下のコマンドになる場合があります。
sudo systemctl restart httpd
PHP-FPMを使っている場合は、PHP-FPMを再起動します。
sudo systemctl restart php8.2-fpm
Nginx + PHP-FPM環境では、PHPを実行しているのはNginxではなくPHP-FPMです。
そのため、設定反映にはPHP-FPMの再起動が特に重要です。
sudo systemctl restart php8.2-fpm
sudo systemctl reload nginx
.user.iniでPHPのメモリ上限を変更する方法
レンタルサーバーやPHP-FPM環境では、.user.ini を使ってPHP設定を変更できる場合があります。
.user.ini は、ディレクトリ単位でPHP設定を行うためのファイルです。
.user.iniの書き方
.user.ini に以下のように記述します。
memory_limit = 256M
WordPressの場合は、wp-config.php がある階層に設置するケースが多いです。
/public_html/.user.ini
または、
/example.com/public_html/.user.ini
のような場所です。
.user.iniを使う際の注意点
.user.ini は、すべてのサーバーで使えるわけではありません。
主にCGI/FastCGI系のPHP環境で利用されます。
PHP-FPMやレンタルサーバーで使われることも多いですが、サーバー側の設定によって無効化されている場合もあります。
また、.user.ini は変更してもすぐに反映されないことがあります。
環境によっては、反映まで数分かかる場合があります。
設定後すぐに値が変わらない場合は、少し時間を置いてから再確認しましょう。
.htaccessでPHPのメモリ上限を変更する方法
Apache環境では、.htaccess にPHP設定を書いてメモリ上限を変更できる場合があります。
.htaccessの書き方
.htaccess に以下を追加します。
php_value memory_limit 256M
これにより、PHPのメモリ上限を 256M に変更できます。
.htaccessを使う際の注意点
.htaccess でPHP設定を変更できるのは、主にApache + mod_phpの環境です。
Apacheを使っていても、PHP-FPMやCGI/FastCGIでPHPを実行している場合、この方法は使えないことがあります。
使えない環境で以下のような記述をすると、500エラーになる場合があります。
php_value memory_limit 256M
もし .htaccess を編集した直後にサイトが表示されなくなった場合は、追加した行を削除してください。
最近のレンタルサーバーやNginx環境では、.htaccess よりもサーバー管理画面、php.ini、.user.ini で変更するケースが多いです。
PHPコード内でメモリ上限を変更する方法
特定のスクリプトだけ一時的にメモリ上限を変更したい場合は、ini_set() を使います。
ini_setで変更する
以下のように記述します。
<?php
ini_set('memory_limit', '256M');
512M に変更したい場合は、以下のように書きます。
<?php
ini_set('memory_limit', '512M');
現在の値を確認する場合は、以下のように記述します。
<?php
echo ini_get('memory_limit');
変更前後を確認する場合は、以下のように書けます。
<?php
echo ini_get('memory_limit') . PHP_EOL;
ini_set('memory_limit', '256M');
echo ini_get('memory_limit') . PHP_EOL;
ini_setを使う際の注意点
ini_set() による変更は、そのPHPスクリプトの実行中だけ有効です。
スクリプトの実行が終わると、設定は元に戻ります。
また、ini_set() を書いた行より前の処理には影響しません。
処理の途中でメモリ不足が発生している場合は、できるだけ早い段階で記述する必要があります。
さらに、サーバー側で設定変更が制限されている場合は、ini_set() で変更できないことがあります。
変更できたか確認したい場合は、戻り値を見る方法もあります。
<?php
$result = ini_set('memory_limit', '256M');
if ($result === false) {
echo 'memory_limitを変更できませんでした';
}
コマンドライン実行時にメモリ上限を変更する方法
PHPをコマンドラインで実行する場合は、-d オプションで一時的に memory_limit を指定できます。
phpコマンドで指定する
以下のように実行します。
php -d memory_limit=512M script.php
無制限にする場合は、以下のように指定します。
php -d memory_limit=-1 script.php
この方法は、CSV処理、データ移行、バッチ処理、画像変換、バックアップ処理などで便利です。
ただし、Webサーバー経由のPHP設定には影響しません。
あくまで、そのコマンドで実行するPHPに対してのみ有効です。
WordPressでPHPのメモリ上限を変更する方法
WordPressでは、wp-config.php に定数を追加してPHPのメモリ上限を変更する方法があります。
WordPressサイトで「Allowed memory size exhausted」のようなエラーが出る場合は、この方法を試すことがよくあります。
wp-config.phpに設定を追加する
wp-config.php に以下を追加します。
define('WP_MEMORY_LIMIT', '256M');
管理画面や画像処理、更新処理などでより大きなメモリを使わせたい場合は、以下も追加します。
define('WP_MAX_MEMORY_LIMIT', '512M');
まとめて書くと、以下のようになります。
define('WP_MEMORY_LIMIT', '256M');
define('WP_MAX_MEMORY_LIMIT', '512M');
追加する場所
追加する場所は、以下のコメントより上です。
/* That's all, stop editing! Happy publishing. */
日本語環境では、以下のようなコメントになっている場合もあります。
/* 編集が必要なのはここまでです ! WordPress でのパブリッシングをお楽しみください。 */
実際には、次のように記述します。
define('WP_MEMORY_LIMIT', '256M');
define('WP_MAX_MEMORY_LIMIT', '512M');
/* That's all, stop editing! Happy publishing. */
WordPressで設定する際の注意点
WordPressの WP_MEMORY_LIMIT や WP_MAX_MEMORY_LIMIT は、PHP本体の制限を必ず上書きできるものではありません。
サーバー側でPHPの memory_limit が固定されている場合、wp-config.php に設定を書いても反映されないことがあります。
たとえば、サーバー側の上限が 128M に固定されている場合、以下のように書いても実際には 256M まで上がらない可能性があります。
define('WP_MEMORY_LIMIT', '256M');
その場合は、レンタルサーバーの管理画面でPHP設定を変更するか、サーバー会社に確認する必要があります。
レンタルサーバーでPHPのメモリ上限を変更する方法
レンタルサーバーでは、管理画面からPHPのメモリ上限を変更できることがあります。
管理画面から変更する
レンタルサーバーの管理画面では、以下のようなメニューにPHP設定が用意されていることがあります。
PHP設定
php.ini設定
PHPバージョン切替
サーバー設定
サイト設定
設定項目に memory_limit がある場合は、以下のように指定します。
memory_limit = 256M
または、プルダウンから 256M や 512M を選択する形式の場合もあります。
レンタルサーバーでの注意点
レンタルサーバーでは、ユーザーが自由に設定できる上限が決まっていることがあります。
たとえば、以下のような制限があります。
128Mまで
256Mまで
512Mまで
変更不可
管理画面で変更できない場合や、変更しても反映されない場合は、サーバー会社のマニュアルを確認するか、サポートに問い合わせるのが安全です。
WordPressの場合も、wp-config.php だけで解決しない場合は、サーバー側のPHP設定を確認しましょう。
Docker環境でPHPのメモリ上限を変更する方法
DockerでPHPを動かしている場合は、コンテナ内のPHP設定を変更します。
設定ファイルを追加する
PHP公式イメージを使っている場合は、/usr/local/etc/php/conf.d/ に設定ファイルを追加する方法があります。
Dockerfileでは、以下のように指定できます。
FROM php:8.2-fpm
RUN echo "memory_limit=512M" > /usr/local/etc/php/conf.d/memory-limit.ini
docker-composeで設定ファイルをマウントする
docker-compose.yml で設定ファイルをマウントする方法もあります。
services:
php:
image: php:8.2-fpm
volumes:
- ./php.ini:/usr/local/etc/php/conf.d/custom.ini
php.ini には以下のように記述します。
memory_limit = 512M
設定後は、コンテナを再起動します。
docker compose restart
Docker環境では、ホスト側のファイルを変更してもコンテナ側に反映されていないケースがあります。
設定ファイルのマウント先や、実際にコンテナ内で読み込まれている設定を確認しましょう。
PHPのメモリ上限を変更しても反映されない原因
PHPのメモリ上限を変更しても、値が変わらないことがあります。
その場合は、以下の原因を確認しましょう。
編集しているphp.iniが違う
PHPには、CLI用とWeb用で別々の設定ファイルが使われている場合があります。
コマンドラインで以下を実行しても、
php --ini
表示されるのはCLI版PHPの設定であることがあります。
Webサイトで使われている設定を確認したい場合は、ブラウザ経由で phpinfo() を実行して確認しましょう。
PHP-FPMを再起動していない
PHP-FPM環境では、php.ini を編集しただけでは設定が反映されない場合があります。
以下のようにPHP-FPMを再起動します。
sudo systemctl restart php8.2-fpm
PHPのバージョンによって、サービス名は異なります。
sudo systemctl restart php8.1-fpm
sudo systemctl restart php8.3-fpm
サーバー側で上限が固定されている
レンタルサーバーでは、ユーザーが設定できる memory_limit の最大値が制限されていることがあります。
たとえば、512M に設定しても、実際には 256M までしか反映されないケースがあります。
この場合は、サーバーの仕様を確認する必要があります。
.htaccessが使えない環境で設定している
PHP-FPMやFastCGI環境では、.htaccess に以下を書いても使えない場合があります。
php_value memory_limit 256M
この記述によって500エラーになることもあります。
.htaccess を編集した直後にサイトが表示されなくなった場合は、追加した記述を削除しましょう。
WordPress側の設定だけでは足りない
WordPressでは、以下のように wp-config.php に設定を書けます。
define('WP_MEMORY_LIMIT', '256M');
しかし、サーバー側のPHP設定が低く固定されている場合、WordPress側の設定だけでは上限を上げられないことがあります。
WordPress側で設定しても反映されない場合は、サーバー管理画面のPHP設定や .user.ini、php.ini を確認しましょう。
PHPのメモリ上限の目安
PHPのメモリ上限は、サイトや処理内容に合わせて設定します。
一般的な目安
目安は以下の通りです。
| 用途 | メモリ上限の目安 |
|---|---|
| 小規模なPHPサイト | 128M |
| 一般的なWordPressサイト | 256M |
| WooCommerceや重いテーマを使うサイト | 512M |
| 大量CSV処理・画像処理・バックアップ処理 | 512M〜1024M |
| 開発環境や一時的な移行処理 | 1024M以上、または一時的に-1 |
WordPressサイトであれば、まずは以下の設定が現実的です。
define('WP_MEMORY_LIMIT', '256M');
define('WP_MAX_MEMORY_LIMIT', '512M');
PHP本体側では、以下のような設定がよく使われます。
memory_limit = 512M
512M以上が必要な場合は原因調査も必要
メモリ不足エラーが出た場合、単純に memory_limit を上げれば解決することがあります。
しかし、512M 以上にしてもエラーが出る場合は、プログラムやプラグイン側に原因がある可能性があります。
たとえば、以下のような原因が考えられます。
無限ループが発生している
大量データを一括で取得している
巨大な配列を作成している
画像処理で大きなファイルを扱っている
WordPressプラグインが重い処理をしている
バックアップ処理が肥大化している
このような場合は、メモリ上限を上げるだけでは根本的な解決になりません。
処理内容を見直し、メモリ消費を抑える必要があります。
PHPのメモリ使用量を確認する方法
PHPでは、現在のメモリ使用量やピーク時のメモリ使用量を確認できます。
現在のメモリ使用量を確認する
現在のメモリ使用量は、memory_get_usage() で確認できます。
<?php
echo memory_get_usage();
MB単位で見やすく表示する場合は、以下のようにします。
<?php
echo memory_get_usage(true) / 1024 / 1024 . ' MB';
ピークメモリを確認する
処理中に最も多く使ったメモリ量を確認する場合は、memory_get_peak_usage() を使います。
<?php
echo memory_get_peak_usage(true) / 1024 / 1024 . ' MB';
処理の途中で確認する場合は、以下のように書けます。
<?php
echo 'Start: ' . memory_get_usage(true) / 1024 / 1024 . " MB\n";
// 重い処理
echo 'After process: ' . memory_get_usage(true) / 1024 / 1024 . " MB\n";
echo 'Peak: ' . memory_get_peak_usage(true) / 1024 / 1024 . " MB\n";
どの処理でメモリ使用量が急増しているのかを調べる際に役立ちます。
大量データ処理ではメモリ上限だけに頼らない
PHPのメモリ不足は、設定値を上げることで解消できる場合があります。
しかし、大量データを扱う処理では、メモリ上限を上げるだけでなく、処理方法を見直すことも重要です。
fetchAllはメモリを使いやすい
たとえば、以下のように大量データを一括で取得すると、メモリを大量に消費します。
$rows = $pdo->query('SELECT * FROM large_table')->fetchAll();
この場合、取得したデータをすべて配列としてメモリ上に保持します。
データ件数が多いほど、メモリ消費量が大きくなります。
1件ずつ処理する
大量データを扱う場合は、1件ずつ処理する方法が有効です。
$stmt = $pdo->query('SELECT * FROM large_table');
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
// 1件ずつ処理する
}
この方法なら、全データを一括で配列に保持しないため、メモリ消費を抑えやすくなります。
WordPressでは全件取得に注意する
WordPressでは、posts_per_page => -1 のように指定すると、対象投稿を全件取得します。
$query = new WP_Query([
'post_type' => 'post',
'posts_per_page' => -1,
]);
投稿数が少ない場合は問題にならないこともありますが、投稿数が多いサイトではメモリ不足の原因になります。
大量の投稿を処理する場合は、件数を区切って取得しましょう。
$query = new WP_Query([
'post_type' => 'post',
'posts_per_page' => 100,
'paged' => $paged,
]);
ページングしながら処理することで、メモリ使用量を抑えられます。
PHPのメモリ上限を変更する際のおすすめ手順
PHPのメモリ不足が発生した場合は、以下の順番で対応するのがおすすめです。
現在のmemory_limitを確認する
まずは、現在の memory_limit を確認します。
<?php
echo ini_get('memory_limit');
または、phpinfo() で確認します。
WordPressの場合は、サイトヘルスやサーバー情報から確認できる場合もあります。
256Mに変更する
現在の値が 128M の場合は、まず 256M に変更してみます。
memory_limit = 256M
WordPressの場合は、以下を追加します。
define('WP_MEMORY_LIMIT', '256M');
必要に応じて512Mに変更する
256M でも不足する場合は、512M を検討します。
memory_limit = 512M
WordPressの場合は、以下の設定がよく使われます。
define('WP_MEMORY_LIMIT', '256M');
define('WP_MAX_MEMORY_LIMIT', '512M');
WooCommerce、ページビルダー、画像処理、バックアップ処理などがある場合は、512M が必要になることもあります。
それでも解決しない場合は原因を調査する
512M にしてもメモリ不足が発生する場合は、設定値の問題だけではない可能性があります。
以下のような点を確認しましょう。
最近追加したプラグインはないか
特定のページだけでエラーが出ていないか
管理画面だけでエラーが出ていないか
画像処理やバックアップ処理で落ちていないか
大量データを一括取得していないか
無限ループが発生していないか
メモリ不足の原因を特定し、処理内容を改善することが重要です。
PHPのメモリ上限を変更する際の注意点
PHPのメモリ上限を変更する際は、単に大きな値にすればよいわけではありません。
大きくしすぎるとサーバーが不安定になる
memory_limit は、1つのPHPプロセスが使えるメモリ量の上限です。
たとえば memory_limit = 512M に設定している場合、1つのPHPプロセスが最大512MBまで使用する可能性があります。
同時アクセスが多いサイトでは、複数のPHPプロセスが同時にメモリを消費します。
そのため、上限を大きくしすぎると、サーバー全体のメモリが不足する可能性があります。
無制限設定は本番環境では避ける
以下のように -1 を指定すると、PHPのメモリ上限は無制限になります。
memory_limit = -1
開発環境や一時的なCLI処理では使うことがありますが、本番環境では基本的に避けた方が安全です。
無限ループやメモリリークが発生した場合、サーバー全体に影響する可能性があります。
上限を上げるだけでなく原因も確認する
メモリ不足エラーが出た場合、memory_limit を上げることは有効です。
しかし、根本原因が重い処理や不具合にある場合、上限を上げても再発する可能性があります。
特にWordPressでは、以下が原因になることがあります。
重いプラグイン
テーマのfunctions.php
バックアッププラグイン
画像最適化プラグイン
WooCommerceの商品数や注文数
大量のカスタム投稿
重いページビルダー
メモリ上限の変更とあわせて、原因調査も行いましょう。
まとめ
PHPのメモリ上限は、memory_limit で変更できます。
基本的な設定は以下です。
memory_limit = 256M
より重い処理がある場合は、以下のように設定します。
memory_limit = 512M
WordPressの場合は、wp-config.php に以下を追加します。
define('WP_MEMORY_LIMIT', '256M');
define('WP_MAX_MEMORY_LIMIT', '512M');
ただし、WordPress側の設定だけで必ず上限を変更できるわけではありません。
サーバー側のPHP設定やホスティング側の制限によっては、反映されない場合があります。
PHPのメモリ上限を変更する際は、以下の順番で進めると安全です。
1. 現在のmemory_limitを確認する
2. サーバー管理画面やphp.iniで設定を変更する
3. WordPressならwp-config.phpにも設定を追加する
4. 反映されない場合は.user.iniやPHP-FPMの再起動を確認する
5. .htaccessはApache + mod_phpの場合のみ試す
6. 512M以上が必要な場合は、処理内容やプラグインも調査する
メモリ不足エラーは、PHPの設定変更だけで解決することもあります。
一方で、重い処理やプログラムの問題が原因になっている場合もあります。
そのため、memory_limit を適切に変更しつつ、メモリを大量に消費している原因も確認することが大切です。
以上、PHPのメモリ上限を変更する方法についてでした。
最後までお読みいただき、ありがとうございました。










