prestissimo-0.3.0を出した

Posted by Hiraku on 2016-06-05

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みたいなカスタムコマンドを生やすことは割と簡単なので、自前実装して一旦置き換えるとかであればできるかも。

PHPの最新記事