composer並列化

プラグイン
@Hiraku
自己紹介
• 中野 拓 (@Hiraku)
• 口癖「composerが遅い」

packagistのミラー作った https://packagist.jp
• 2015/12からメルカリで働いています。
俺
俺
使ってね!
composerは
どこが遅いのか?
composer update で

実行される処理
1. パッケージ情報取得
2. 依存関係の解析
3. zipダウンロード
1. パッケージ情報取得が遅い
• packagist.orgが日本から遠いことが原因
• 解決策:
• ミラーを作る (https://packagist.jp )

本家に許可取ったので合法になった
• composer.lockをコミットしておき、

composer installだけ行う
2. 依存解決が遅い
• (実はそれほど遅くない)
• 解決策:
• PHPを速くする(PHP7、HHVMを使う)
• 良いCPUを使う
3. zipダウンロードが遅い
• github.com からzipをダウンロードする作業
• github.comが遠いのと、file_get_contentsが
アホの子(コネクション毎回捨てる)
• zipごとミラーするのは大変、良い解決策がな
かった
packagist遅い 依存解決
ダウンロードが

遅い
composer
update
ミラーを参照する PHP7を使う 遅い
composer.lock

+
composer
install
(処理スキップ) (処理スキップ) 遅い
本体にパッチを当てるか…
• curlを使えってP-Rは何個か出てる
• https://github.com/composer/composer/issues/
704
• https://github.com/composer/composer/pull/3636
• https://github.com/composer/composer/pull/2696
• 後方互換性の担保でいつも頓挫する
黒歴史
composer本体改善の壁
• 通信周りの 機能が多い上、分割されていなくて再実装するしか
ない
• proxy, github, gitlabの認証対応
• ダウンロード進 の表示
• ユーザー名パスワードを入力させてリトライ
• degradedMode (IPv4強制?)
• これで互換性保つのは確かに面倒くさい
と思ってたらこんな話が
composerプラグインで

curl化できるらしい…
プラグインなら本体に

マージされなくても

試してもらえる

実績も積める
どうせなら

並列ダウンロードも

できるんじゃね?
(できた)
hirak/prestissimo
インストール簡単
• composer global require hirak/prestissimo

って打つと組み込まれる
• composer global remove hirak/prestissimo

って打つとアンインストールできる
• 有効になってればcomposer update,
composer installなどで勝手に効力を発揮する
prestissimoとは
• composerプラグイン。globalインストールすることで以下の機能を付与する
• curl_multiでの並列zipダウンロード。並列数はカスタマイズ可能

プラグイン側で先に並列ダウンロードしてキャッシュを暖める
• GitHub API制限緩和(api.github.comを極力叩かない)
• Keep-Alive有効化(HTTPSでも遅くならないよ)
• 互換性担保、速くなること以外はcomposerの動作に影響を与えない
• 「超速く演奏しろ」の意味でプレスティッシモと命名
デモ
人柱募集
• 認証の再実装部分が不安
• 使ってバグ出ししてくれ!!
• プラグインで実績積んで、安定性が認められ
たら本体にマージを提案する計画です
• https://github.com/hirak/prestissimo
参考文献
• http://qiita.com/ngyuki/items/
03f9c6ce0f0db18ace94
• https://github.com/ngyuki/composer-curl-
plugin
• https://getcomposer.org/doc/articles/
plugins.md#event-handler

Composer並列化プラグイン #phpblt