モヒカンメモ

髪色が定期的に変わることに定評のある(比較的)若者Webエンジニアの備忘録

PHPUnit実行時にメモリ使用量制限に引っかかる場合の対処方法

たくさんのテストケースを抱えるプロダクトでPHPUnitを実行した際、下記のようなエラーが表示されることがある。

エラーメッセージ:

$ ./vendor/bin/phpunit
...
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted

これはPHPのメモリ使用量制限 (memory_limit) を超えてメモリを確保しようとしたためPHPがプログラムの実行を中断したことを示すエラーメッセージ。

対処方法

メモリをたくさん使っているテストケースを見つけていい感じに直すという方法もあるが、元々PHPはメモリどのぐらい使うかとかは些細なこととしてあまり気にしない文化だと思うので (メモリ10GB食うみたいなアホみたいな状態でない限り) メモリ使用量制限を引き上げて凌ぐのが良いと思う。

(1) phpunit.xmlでメモリ使用量上限を引き上げる

PHPUnitの設定ファイル phpunit.xml に設定を書くことで、PHP設定を一時的に変更した状態でPHPUnitを実行することができる。

phpunit.readthedocs.io

デフォルト128MBから512MBへメモリ使用量上限を引き上げたければ下記のように変更する。

--- a/phpunit.xml
+++ b/phpunit.xml
@@ -2,5 +2,6 @@
 <phpunit>
     <php>
         <env name="APP_ENV" value="test"/>
+        <ini name="memory_limit" value="512M"/>
     </php>
 </phpunit>

個人的にはこの方法が一番妥当だと思うのでおすすめしたい。

(2) PHP実行時オプションでメモリ使用量上限を引き上げる

php コマンドにある -d オプションで一時的にPHP設定を変更することができる。

$ php --help
Usage: php [options] [-f] <file> [--] [args...]
...
  -d foo[=bar]     Define INI entry foo with value 'bar'
...

例:

$ php -i | grep memory_limit
memory_limit => 128M => 128M   # ← デフォルトでは上限128MB

$ php -d "memory_limit=512M" -i | grep memory_limit
memory_limit => 512M => 512M   # ← 一時的に上限512MBへ引き上がっている

これまで ./vendor/bin/phpunit ./tests のようにPHPUnitを実行していた場合、 php -d "memory_limit=512M" ./vendor/bin/phpunit ./tests のようにして実行時オプションを指定する。

(3) php.iniでメモリ使用量上限を引き上げる

PHPの設定ファイル php.ini でメモリ使用量上限を変更することができる。

www.php.net

f:id:pinkumohikan:20220115200027p:plain
リソース制限: memory_limit

ただし、php.iniの影響範囲はシステムグローバルとなるので、特定のツール (PHPUnit) のためだけにグローバルな設定を変えるというのはあまりお行儀が良くないようにも思う。