パフォーマンス向上で注目の Composer 2。現状まだ RC1 だが、Drupal 8 と Drupal 9 は既に Composer 2 互換になっており、サイトのインストールやモジュールの追加/削除を実際に試してみることができる。
Composer をバージョン 2(現状 RC1)にアップデートするには、
$ composer self-update --snapshot
元のバージョンに戻すには、
$ composer self-update --rollback
のように実行すればよい。ただ、日常の作業で欠かせないツールをまだ RC1 の次バージョンに上げてしまうのは(戻せるとしても)抵抗があるかもしれない。
そんな人でも不安なく Composer 2 で Drupal を試せる実行例を、Acquia の Gábor Hojtsy 氏が公開した。
- Testing Composer 2 RC1 with Drupal 9: huge memory and time savings; and what does it mean for Drupal
自分も Composer 2 を試したことがなかったので、この例にならって実際にやってみた。
使用環境は、VirtualBox 上の CentOS8 仮想マシン、PHP のバージョンは 7.4:
$ php -v
PHP 7.4.11 (cli) (built: Sep 29 2020 10:17:06) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.11, Copyright (c), by Zend Technologies
with Xdebug v2.9.8, Copyright (c) 2002-2020, by Derick Rethans
まず、最新の Composer 1 と Composer 2 を実験用に個別ダウンロード:
$ curl https://getcomposer.org/composer-1.phar --output composer-1.phar
$ php composer-1.phar -V
Composer version 1.10.13 2020-09-09 11:46:34
$ curl https://getcomposer.org/composer-2.phar --output composer-2.phar
$ php composer-2.phar -V
Composer version 2.0.0-RC1 2020-09-10 15:39:45
これで、普段使っているグローバル インストールの composer コマンドには触ることなく、Composer 1 と Comoser 2 を試すことができる。
では、drupal/recommended-project テンプレートで Drupal 9 をインストールしてみよう。1 と 2 とでパフォーマンスを比較するため、--no-cache(キャッシュ無効化)と --profile(メモリと時間の計測)の各オプションを指定して実行する。
Composer 1 の実行結果:
$ php composer-1.phar --no-cache --profile create-project drupal/recommended-project composer1site
~
Memory usage: 9.4MiB (peak: 196.79MiB), time: 94.41s
Composer 2 の実行結果:
$ php composer-2.phar --no-cache --profile create-project drupal/recommended-project composer2site
~
Memory usage: 12.56MiB (peak: 13.77MiB), time: 34.77s
実行時間が約 1/3、メモリのピーク使用量は 1/14 になった。
次に、モジュールのインストールと削除の例。
Composer 1 でインストールしたサイトで、Composer 1 を使って metatag モジュールのインストールと削除を行ってみる。
$ cd composer1site
$ php ../composer-1.phar --no-cache --profile require drupal/metatag
Memory usage: 629.61MiB (peak: 1557.56MiB), time: 265.13s
$ php ../composer-1.phar --no-cache --profile remove drupal/metatag
Memory usage: 450.98MiB (peak: 1377.86MiB), time: 237.71s
では、Composer 2 でインストールしたサイトで同じ処理を実行するとどうなるか。
$ cd ../composer2site
$ php ../composer-2.phar --no-cache --profile require drupal/metatag
Memory usage: 13.72MiB (peak: 14.26MiB), time: 4.77s
$ php ../composer-2.phar --no-cache --profile remove drupal/metatag
Memory usage: 12.24MiB (peak: 12.61MiB), time: 0.27s
メモリの使用量で約 1/100、実行時間で2桁から3桁下の数値が出ている。体感的にも Composer 2 の方は一瞬で終わる感じだった。
まとめると、
メモリ使用量のピーク値(単位=MiB):
操作 | Composer v1 | Composer v2 | 比較 (v2/v1) |
---|---|---|---|
D9 インストール | 196.79 | 13.77 | 0.07 |
Metatag インストール | 1557.56 | 14.26 | 0.009 |
Metatag 削除 | 1377.86 | 12.61 | 0.009 |
実行時間(単位=秒):
操作 | Composer v1 | Composer v2 | 比較 (v2/v1) |
---|---|---|---|
D9 インストール | 94.41 | 34.77 | 0.36 |
Metatag インストール | 265.13 | 4.77 | 0.017 |
Metatag 削除 | 237.71 | 0.27 | 0.0011 |
劇的に改善することがよくわかる。
drupal.org でホストされているプロジェクトの2割近くが外部パッケージに依存しているそうで、Composer なしで Drupal サイトを維持するのは今後ますます難しくなっていくと思う。それだけに、Composer 2 のパフォーマンス向上は Drupal にとっても意義深い。
参考資料
- Composer 2: What's new and changed
- Testing Composer 2 RC1 with Drupal 9: huge memory and time savings; and what does it mean for Drupal
- Allow Drupal to work with Composer 2
- Composer v1 vs v2 performance comparison - Drupal 9
- Composer 2.0-alpha2 performance comparison (speed and memory)
- Using Composer to Install Drupal and Manage Dependencies