ことの発端
昔書いたライブラリで以下のエラーが出るようになりました。
しかも、php5.5とphp5.6のみ。
なんやねーんこれ。というわけで調べてみたらあっさり解決できたのでメモしておきます。
※ 同じエラーで困っている人がいてなにかの役に立てればこれ幸い
エラー内容
- php5.5
$ travis_retry composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
PHP Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 72 bytes) in phar:///home/travis/.phpenv/versions/5.5.38/bin/composer/src/Composer/DependencyResolver/Rule2Literals.php on line 48- php5.6
$ travis_retry composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
PHP Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 83 bytes) in phar:///home/travis/.phpenv/versions/5.6.32/bin/composer/src/Composer/DependencyResolver/RuleWatchGraph.php on line 100うん、どれもcomposer updateしたときにメモリオーバーで死んでいることがわかります。
このエラーって、開発中にたまに見かけるエラーだったりしますよね。
そんなとき、個人的には以下のコマンドで解決を図ることが多いです。
$ php -d memory_limit=-1 /usr/local/bin/composer install要はphp.iniの設定弄っちゃう感じです(memory_limit=-1 はちょっと横暴だけど)。
つまりは、似たようなことができればOKというわけですね。
解決方法
ググってみると、
- Travis-CI and composer out of memory • lorenzo milesi
- yii2 – Unable to change Travis-CI PHP memory_limit – Stack Overflow
があっさり見つかりました(けっこういるんやな。。)。
これらの記事によると、.travis.ymlにこれを書けと言っております。
before_install:
- echo "memory_limit=2G" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.iniなるほど〜。ではやってみようというわけで、やってみたのがこちら。
見事に解決。
だが待ってほしい
解決しましたが、これだとphpの設定を弄ってしまうことになり後続の処理に影響があります。composer install実施中だけ、memory_limitを変えたいわけです。
で、先程の記事をよく読んでみると
COMPOSER_MEMORY_LIMIT=-1 travis_retry composer install --prefer-dist --no-interactionが一番のベストソリューションやでっ!と書いています。
なるほど〜。ではやってみようというわけで、やってみたのがこちら。
👍 Use COMPOSER_MEMORY_LIMIT. · shimabox/pemojine@af60334
ほい。見事に解決。
まとめ
composer install | updateしたときにメモリオーバーで死んだら
COMPOSER_MEMORY_LIMIT=-1を使おう!!
てか、Troubleshooting – Composer にも書いてある〜。
(あれ、これつまりcomposerの話になるからTravis関係なくなってない?まぁいいか)
ちなみに冒頭で書いたライブラリの紹介記事はこれです。
PHPで絵文字を扱うライブラリ “Pemojine”を書いた | Shimabox Blog
余談
なんで、php5.5と5.6だけメモリが少ないのか気になったのでちょっとiniファイルを調べてみました。
Build #131 – shimabox/pemojine – Travis CI
$ php -r "echo ini_get('memory_limit').PHP_EOL;"
1G
$ cat ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini
memory_limit = 1G
date.timezone = "UTC"
phar.readonly = 0
mysql.default_socket = /var/run/mysqld/mysqld.sock
mysqli.default_socket = /var/run/mysqld/mysqld.sock
pdo_mysql.default_socket = /var/run/mysqld/mysqld.sock
xdebug.max_nesting_level = 256
$ cat ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini
[PHP]
;;;;;;;;;;;;;;;;;;;
; About php.ini ;
;;;;;;;;;;;;;;;;;;;
; PHP's initialization file, generally called php.ini, is responsible for
; configuring many of the aspects of PHP's behavior.
; 〜略〜
; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 128M
; 〜略〜調べてみたんですけども、どのphpにも自分には違いが見られなかったです。。whyだぜ。
phpのバージョンによってcomposerの処理内容(メモリ効率)が違うのでしょうか。
それともどこかに違いはあるのか?この謎を解明するべく我々スタッフ一同はアマゾンの奥地へ飛んだ。
(Fin)

