composerを速くするプラグイン prestissimo ですが、さっき0.3.0をリリースしました。
若干出来が怪しいので、バージョンを上げる人は覚悟願います。 今のところ一番安定してるのは0.2.4です。
ただし、0.3の方が高速なはずです。
prestissimoのバージョンごとの違い
そろそろ自分でも忘れそうになってきたので、今までの歴史をメモしておきます。一応、semver的には0.x系ならば互換性無視してバージョンを上げられることになっていますが、さすがにアレなので、minorバージョンが変わるときは何となく理由を作っています。
0.0系
昔composer本体にPull Requestを送ったものの取り入れられなくて、勿体無いと思ってプラグイン化したものが初期実装です。タグは打ってません。
- streamの
https://
とhttp://
を置き換えることで、全通信でKeep-Aliveを有効にしようと試みた - composer本体が、
$http_response_header
変数に依存する書き方をしていたため、curlで標準streamを再現できずに撃沈 - なのでCurlStreamという名残のクラスが存在してるけど、あまり使う必要性はなかった
0.1系
並列ダウンロード機能を増やしたもの。PHPBLTで発表したのはこの時点のもの。
Composer\Util\RemoteFilesystem
を打倒するべく、互換性のある実装を目指したもの- 認証機能などはちゃんと再現するようにがんばった
- ついでに並列で先にzipをダウンロードする機構を追加
有名になったのはこの時点。不具合報告と非互換性の報告が多数上がり、対応に追われました。
そして段々、「完璧に互換性のある置き換え」は無理なんじゃないかと思い始めました。
0.2系
composer本体にマージしてもらうべく、非互換の根源であるComposer\Util\RemoteFilesystem
の置き換えを断念したもの。
ソースコードをぎゅっと圧縮し、クラス数も一時的にかなり減らすことができました。
- RemoteFilesystemのKeep-Alive機能を削除
- なので、0.1系とくらべて遅くなっている
- 並列ダウンロードは書き込み先のあるパターンのみになったため、大幅にソースコードを書き直した
Parallel downloader by hirak ・ Pull Request #5293 ・ composer/composer
今、composer本体にPull Request中のコードは、この頃のものをベースにしています。
これでもいいかな、と思ったものの、composerがhttpsを必須にしたことにより、私がこのバージョンの遅さに耐え切れなくなってきました。やっぱりKeep-Aliveは有効にしたい。
0.3系(さっき出した)
Composer\Util\RemoteFilesystem
の置き換えはやはり必要。ただし、完璧な置き換えは実装上困難。そこで、何らかの理由でcURL版での通信が失敗した場合、もとのComposer\Util\RemoteFilesystem
のダウンロード機構を呼び出すように修正しました。
非互換の問題はこれで解決したはず。
もう一つ大きな目標として、packagist.orgのjsonファイルを高速に並列ダウンロードしたい、というのがありました。 本体へのパッチであれば可能っぽいのですが、プラグインでは中々難しく、難航中です。
- CurlRemoteFilesystemを復活させた
- 失敗したらオリジナルの実装にフォールバックするようにした
- 実験的に、packagist.orgの一部ファイルを並列ダウンロードできるようにした
あとは、DependencyResolverをもっと高速にすることかな。。
コマンドの置き換えは難しいけど、composer fast:install
とかcomposer fast:update
みたいなカスタムコマンドを生やすことは割と簡単なので、自前実装して一旦置き換えるとかであればできるかも。