たくさんのテストケースを抱えるプロダクトで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を実行することができる。
デフォルト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
でメモリ使用量上限を変更することができる。
ただし、php.iniの影響範囲はシステムグローバルとなるので、特定のツール (PHPUnit) のためだけにグローバルな設定を変えるというのはあまりお行儀が良くないようにも思う。