Travisでcomposer install | update したときにメモリオーバーで死ぬときの対応

CI,PHP

ことの発端

昔書いたライブラリで以下のエラーが出るようになりました。

しかも、php5.5php5.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.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

が一番のベストソリューションやでっ!と書いています。
なるほど〜。ではやってみようというわけで、やってみたのがこちら。

:+1: 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)

スポンサーリンク

CI,PHPtravis

Posted by shimabox