Slide 1

Slide 1 text

Composer 2.0って何? どう変わるの? 読んでみました! PHP Conference Japan 2020 Hideki Kinjyo GitHub: o0h / Twitter: @o0h_ [ൃද൛]

Slide 2

Slide 2 text

ࣗݾ঺հ • ⾦城秀樹 / きんじょうひでき • GitHub: @o0h / Twitter: @o0h_ • 好きなFWはCakePHP • アイコンは 美味しい鮭親⼦丼の写真です

Slide 3

Slide 3 text

ところで PHP8の噂は もう聞きましたか?

Slide 4

Slide 4 text

PHP5->7のような 劇的なパフォーマンス改善は今回は 控えめ・・?

Slide 5

Slide 5 text

じゃあPHPはもう速くならない?

Slide 6

Slide 6 text

⼤丈夫、Composer2がいますよ

Slide 7

Slide 7 text

本⽇は Composerのお話です! Composer\Console\Application::$logo

Slide 8

Slide 8 text

https://blog.packagist.com/composer-2-0-is-now-available/ 2020-10-24

Slide 9

Slide 9 text

͓͠ͳ͕͖ 1. ͬ͟ͱComposer2ͷ৽ػೳͷ͓͞Β͍ʂ • ͲΜͳʮ໰୊ղܾʯ͕ߦΘΕͨͷʁ 2. ʮมΘͬͨ෦෼ʯͷத਎Λ೷͍ͯΈΔ • ʮύοέʔδ৘ใͷऔಘʯ·ͰͷྲྀΕͷ࡮৽Λݟൺ΂ͯΈΑ͏ ˒ʮӡ༻ʯʮҠߦϊ΢ϋ΢ʯΈ͍ͨͳ࿩͸͠·ͤΜʂ • Ͳ͏ͧʂ https://getcomposer.org/upgrade/UPGRADE-2.0.md

Slide 10

Slide 10 text

͜ͷςʔϚΛબΜͩ໨త • ໰୊ͷઃܭͱղ๏ʹڵຯ͕͋Δ => ։ൃͷ୉ޣຯͰ͠ΐʁ • ͦΕ΋ීஈ࢖͍ͬͯΔπʔϧʹى͖ͨ => ਎ۙͳ࿩ͩʂ • Composer͸ԿΛ૝͍ɺͲ͏มΘͬͨͷ͔ɾɾʁ

Slide 11

Slide 11 text

この発表を通じて 「お、じゃあComposerで分からない事が あったらソース⾒てみよ!」 と思えるキッカケになったら幸い!

Slide 12

Slide 12 text

§1: Composer2の新機能

Slide 13

Slide 13 text

Composer2になって変わった部分を おさらいしていきます https://blog.packagist.com/composer-2-0-is-now-available/ 「1/ What's new?」より 駆け⾜で

Slide 14

Slide 14 text

Performance improvements • ϝϞϦ࢖༻ྔ΍଎౓໘ͰͷύϑΥʔϚϯεվળ • “I've seen reports of improvements of over 50% to both in some projects” (!!!!) • ґଘղܾͷํ๏ͷมߋɺฒྻDLͷಋೖɺϝλσʔλಡΈ ࠐΈͷվળͳͲ

Slide 15

Slide 15 text

Architectural changes and determinism • ґଘղܾ࣌(require, update)ͷڍಈΛมߋ • vendorσΟϨΫτϦͷத਎Λมߋ͢Δͷ͸ɺωοτϫʔΫ Λ·͍ͨͩ࡞ۀΛશͯऴ͑ͨޙʹߦ͏Α͏ʹͨ͠ • ͜ΕʹΑͬͯʮߋ৽தʹωοτ͕੾Εͯvendor͕த్൒ ୺ʹյΕͨʯͱ͍ͬͨ໰୊΋αϤφϥʂ

Slide 16

Slide 16 text

Partial updates with temporary constraints • ಛఆύοέʔδͷόʔδϣϯΛҰ࣌తʹߋ৽Ͱ͖ΔΑ͏ʹ • composer update hoge/fuga:2.* ͷΑ͏ʹར༻ • ͜͏͢Δͱcomposer.jsonϑΝΠϧ΍.lockϑΝΠϧͷ content-hashΛߋ৽͠ͳ͍ • (ύονόʔδϣϯͷࢦఆͳͲ) Ұ࣌తʹৄࡉͳࢦఆͰup/downgrade͍ͨ࣌͠ͳͲʹศརʂ

Slide 17

Slide 17 text

ࢀߟʹͳΓͦ͏ͳจݙ • Composer 2.0 is now available! https://blog.packagist.com/composer-2-0-is-now- available/ • Composer 2: What's new and changed • PHP.Watch https://php.watch/articles/composer-2 ※ ։ൃத(2020-04࣌఺)ͷهࣄͳͷͰ஫ҙ

Slide 18

Slide 18 text

§2:「変わった」の中⾝を覗いてみる

Slide 19

Slide 19 text

まずはv2の威⼒を確認

Slide 20

Slide 20 text

v 1.10.17 v 2.0.7 v1とv2でcakephp/cakephpを同時にrequireしてみます

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

めっちゃ凄い

Slide 23

Slide 23 text

掘り下げていきます

Slide 24

Slide 24 text

§2.1:「パッケージ情報の取得」の 変化を⾒てみる

Slide 25

Slide 25 text

そもそもComposerって何をするもの?

Slide 26

Slide 26 text

Composerって何?どう動くの?読んでみました! (PHP Conference 2019) https://speakerdeck.com/o0h/lets-read-composer?slide=20

Slide 27

Slide 27 text

Composerって何?どう動くの?読んでみました! (PHP Conference 2019) https://speakerdeck.com/o0h/lets-read-composer?slide=21

Slide 28

Slide 28 text

PackageͱRepository • Package • 「何かを含む1つのディレクトリ」、ひとかたまりのソフ トウェア(など) • Composerの実装では Composer\Package\PackageInterfaceとして表現される

Slide 29

Slide 29 text

PackageͱRepository • Repository • パッケージ情報を問い合わせる先で、パッケージとその バージョン情報のリストを持っている • Composerの実装では Composer\Repository\RepositoryInterface として表現さ れる • デフォルトのリポジトリはpackagist.org

Slide 30

Slide 30 text

ύοέʔδ৘ใͷऔಘ·ͰͷΠϝʔδ ύοέʔδ؅ཧπʔϧ ϨϙδτϦ パッケージの情報はどうすれば⼿に⼊りますか! ココに⾏けばソレがあるよ! パッケージの情報を貰いに来ました! どうぞ〜 依存の解決や パッケージのDLへ

Slide 31

Slide 31 text

ύοέʔδ৘ใͷऔಘ·ͰͷΠϝʔδ ྫ͑͹ʮ`vendor/hoge`ͱ͍͏ύοέʔδΛΠϯετʔϧ͢Δʯ৔߹͸ (=> ίϚϯυྫ: `composer require vendor/hoge`) 1.ʮϨϙδτϦʯʹʮvendor/hogeͷ৘ใͷࡏΓॲʯΛ໰͍߹Θͤ 2.ʮvendor/hogeͷ৘ใ(ύοέʔδͷϝλ৘ใ)ʯΛऔಘ͠ 3. ʮvendor/hogeͷຊମʯΛऔಘ͠ɺద੾ͳσΟϨΫτϦʹ഑ஔ͢Δ

Slide 32

Slide 32 text

v1の場合

Slide 33

Slide 33 text

v1ͷࡍͷେ·͔ͳྲྀΕ 1. ϨϙδτϦ(Packagist)͔ΒύοέʔδͷҰཡΛऔಘ͠ • ʮPackagistʹ͋ΔύοέʔδͷશϦετʯͷऔಘ • Ϧετ͸෼ׂ͞Ε͍ͯΔͷͰɺιϨΛॱ࣍DL 2. શϦετΛಡΈࠐΈɺͦͷத͔Β໨౰ͯͷύοέʔδ৘ใͷࡏΓॲΛಡ ΈࠐΈ 3. 2Ͱಘͨ৘ใ͔Βύοέʔδ৘ใΛDL

Slide 34

Slide 34 text

packages.json? • ࠷ॳʹʮpackages.jsonʯͱ͍͏ϑΝΠϧΛऔಘ • ͜Εࣗମ͸ύοέʔδ৘ใΛ࣋ͨͣɺ ϨϙδτϦʹؔ͢Δϝλ৘ใΛอ࣋ • ͜ͷ಺༰Λղऍ͠ɺ ۩ମతͳύοέʔδϦετ (provider file)Λ औಘ͠ʹߦ͘

Slide 35

Slide 35 text

• ͦΕͧΕͷϑΝΠϧ͕਺MBʹٴͿ • ݱ࣌఺Ͱ13෼ׂͷϦετ͕͋ΓɺͦΕΒΛ௚ྻʹDL͢Δ 分割の様⼦ メモリと時間が 喰われていく様⼦ ハッシュ値による キャッシュ管理 p/provider-$name$%hash%.json

Slide 36

Slide 36 text

provider.json? • {ύοέʔδ໊: {hash}}[] ͕ྻڍ͞Ε͍ͯ·͢ • ͜ΕΒͱ package.jsonͷ৘ใΛ࢖ͬͯ ύοέʔδͷϝλ৘ใͷ ډ৔ॴ͕෼͔Δ࢓૊Έ

Slide 37

Slide 37 text

• ͦΕͧΕͷϑΝΠϧ͕਺MBʹٴͿ • ݱ࣌఺Ͱ13෼ׂͷϦετ͕͋ΓɺͦΕΒΛ௚ྻʹDL͢Δ お⽬当ての パッケージの情報をDL 全ファイルを読み込み ύοέʔδͷϝλ৘ใͷऔಘ

Slide 38

Slide 38 text

[v1]ύοέʔδ৘ใͷऔಘ·ͰͷΠϝʔδ $PNQPTFS 1BDLBHJTU packages.json /p/provider-{$name}XXX%hash.json /p/{$name}%hash.json x13? x? ௚ྻ

Slide 39

Slide 39 text

v1ͷΩϟογϡػߏ • provider fileɺύοέʔδͷϝλϑΝΠϧ͸ϩʔΧϧʹΩϟογϡ͞ΕΔ • ࣍ճҎ߱ɺ·ͣ͸packages.jsonʹ໰͍߹ΘͤΔ • packages.jsonʹهࡌ͞Ε͍ͯΔ֤provider fileͷϋογϡ஋ͱ ϩʔΧϧʹ͋Δprovider fileͷϋογϡ஋Λൺֱ • ֤provider file͸ɺͦ͜ʹؚ·ΕΔύοέʔδ͕Կ͔͠Βߋ৽͞Εͨ৔ ߹ʹϋογϡ͕ߋ৽͞ΕΔ • ΋͠ϩʔΧϧʹ͋Δ΋ͷͱಉ͡ͳΒʮߋ৽ͳ͠ʯ => Ωϟογϡར༻

Slide 40

Slide 40 text

v2の場合

Slide 41

Slide 41 text

ύοέʔδͷϝλ৘ใͷऔಘ·ͰͷྲྀΕ • ࠷ॳʹpackages.jsonΛऔಘͯ͠ ⾨͜Ε͸ಉ͡ • ࣍ʹύοέʔδͷϝλ৘ใΛऔಘ͢Δ ⾨ʂʁʂʁ

Slide 42

Slide 42 text

v1 -> v2ͷมߋ఺ • provider filesΛҰ੾ಡΈࠐΜͰ͍ͳ͍ • DL΋ͯ͠ͳ͍͠ • ϝϞϦ΋࢖Θͣʮϝλ৘ใͷ৔ॴʯΛ೺ѲͰ͖͍ͯΔ • ܶతʹޮ཰্͕͕͍ͬͯΔ • ͪͳΈʹɺ ઌͷσϞಈը಺Ͱ࠷ॳͷϝλ৘ใͷDL։࢝࣌఺Ͱͷܦաඵ਺͸ v1͸15.04sɺv2ͩͱ0.33sͰ͢ ⾒逃しちゃうね

Slide 43

Slide 43 text

どうやってるの・・?

Slide 44

Slide 44 text

§2.2:新しい時代のキャッシュ戦術

Slide 45

Slide 45 text

lazy provider • v2ͷϦϦʔεʹࡍͯ͠packages.jsonͷܗ͕ࣜมߋ͞Ε͍ͯΔ • ͦͷ಺ͷ1͕ͭ `metadata-url` ͱ͍͏ϑΟʔϧυ • ͜Ε͸ʮύοέʔδ໊͕෼͔Ε͹ϝλ৘ใͷ৔ॴ͕Θ͔Δʯͱ͍͏API ͱͳΔ • v1ͷ `providers-url`ʹ͸ hash஋͕ඞཁͩͬͨ => ΋͸΍ෆཁʹʂ

Slide 46

Slide 46 text

[v2]ύοέʔδ৘ใͷऔಘ·ͰͷΠϝʔδ $PNQPTFS 1BDLBHJTU packages.json /p2/{$name}.json ʮεοΩϦͨ͠ΜͩͶʯ

Slide 47

Slide 47 text

lazy provider • ʮઌʹϦετશಡΈࠐΈ͠ͳͯ͘OKʯͰɺ஗Ԇ = lazy • ͨͩ͠ɺlazy providerͷ࢓૊Έࣗମ͸ੲ͔Β͋ͬͨ • https://github.com/composer/composer/commit/44e45ed (ϦϦʔεతʹ͸1.0.0αͷ΋ͷ) • ࣮ࡍʹv1ࣗମ͔Βར༻ྫ͕͋Δ • Packagistޓ׵ͷϨϙδτϦ • force-lazy-providersΦϓγϣϯ (see: composer/composer#4269)

Slide 48

Slide 48 text

どうして差がついたのか・・・ => 通信、キャッシュの違い

Slide 49

Slide 49 text

lazy providerʹΑΔϝλ৘ใͷऔಘͷΠϝʔδ $PNQPTFS 1BDLBHJTU phpunit/phpunit.json psr/log.json symfony/process.json phpstan/phpstan.json 302?

Slide 50

Slide 50 text

v2ͷΩϟογϡํࣜ • v2͸metadata-urlΛ༻͍ͯ ͋ΔҙຯͰ͸౤ػతͳϦΫΤετΛࢼߦ͍ͯ͠Δ • if-modified-sinceΛ͚ͭͯɺ302͕དྷͨΒcacheར༻ • ͦͷͨΊʹDL͢Δ ύοέʔδͷϝλ৘ใ΋ܗ͕ࣜมߋ͞Ε͍ͯΔ • last-modifiedϑΟʔϧυͷ௥Ճ provider-cakephp~cakephp.json

Slide 51

Slide 51 text

௨৴ίετͱΩϟογϡͷํࣜ ʮύϥϨϧͰϦΫΤετग़དྷΔ͔ʯʹΑΔ

Slide 52

Slide 52 text

[v]ύοέʔδ৘ใͷऔಘ·ͰͷΠϝʔδ $PNQPTFS 1BDLBHJTU phpunit/phpunit.json, psr/log.json, symfony/process.json, phpstan/phpstan.json ฒྻ packages.json ௚ྻ

Slide 53

Slide 53 text

Ωϟογϡํࣜͷൺֱ • v1ͷ৔߹ɿ • cons: provider fileͷશಡΈࠐΈ͕ॏ͍ • pros: ࠷ྑͷέʔεͰ͸ɺpackages.jsonΛݟ͚ͨͩͰʮߋ৽ͳ͠ʯͱ֬ఆͰ͖ Δ • v2ͷ৔߹: • cons: ύοέʔδ਺͚ͩඞͣϦΫΤετ͕ੜ͡Δ • pros: ࠷ѱͷέʔεͰ΋ɺύοέʔδ෼ͷϝλσʔλͷྔ͔͠௨৴͠ͳ͍ͰࡁΉ

Slide 54

Slide 54 text

Composerͱฒྻ௨৴ • (ྺ࢙తʹ)Composer͸v1࣌୅ʹ͸cURLΛੵۃతʹར༻͢ Δ͜ͱΛආ͚͍ͯΔ • curl_multi ΋ར༻͠ͳ͍ • ʮ઀ଓʯ΍ʮϦΫΤετ਺ʯΛݮΒ͢͜ͱ΁ͷ Ϟνϕʔγϣϯ͕ߴ͍

Slide 55

Slide 55 text

Composerͱฒྻ௨৴ • 2016೥ͷ࣌఺Ͱʮຊମʹext-curlલఏͷػೳΛऔΓࠐΉ ͔ʯ͸ٞ࿦͞Ε͍ͯΔ(composer/composer#3930) • λΠϛϯάతʹʮ1.0௚લ͔ͩΒʯͱ͍͏ཧ༝ͰݟૹΓ • 1.0.0 = 5 Apr 2016 / prestissimo 0.1.1 =7 Jan 2016

Slide 56

Slide 56 text

v2: post ext-curl & curl_mutli • v2Ͱʮmetadata-urlʯۦಈͰΩϟογϡνΣοΫͰ͖Δͷ͸ɺ curlͷར༻΍ฒྻ௨৴ͷར༻ʹ଩Λ੾͔ͬͨΒ • file_get_contents()ͷύϑΥʔϚϯε໰୊͸ɺ ͔ͶͯΑΓٞ࿦ʹ্͕͍ͬͯͨ • ͨͩ͠ɺ(composer.jsonΛݟͨΒ෼͔ΔΑ͏ʹ) ext-curlΛඞਢʹ͸͍ͯ͠ͳ͍ɻ͋͘·Ͱʮ͋Ε͹ૣ͘ͳΔʯ࣮૷

Slide 57

Slide 57 text

ͭ·ΓComposerͷv2͸ɾɾʁ ʮεοΩϦͨ͠ΜͩͶʯ

Slide 58

Slide 58 text

§2.3: その他のv2の⾒どころ

Slide 59

Slide 59 text

͜͜Ͱ࿩͢ʹ͸͕࣌ؒ଍Γͳͦ͏ͳͷͰɾɾɾ ໘ന͍΋ͷΛ঺հ͠·͢ʂʂ (օ͞Μ΋Composerͷཱྀ΁μΠϒ͍ͯͩ͘͠͞ʂʂ)

Slide 60

Slide 60 text

ʮൈຊతʯͱ͍͑Δมߋ෦෼Λ௥͍͍ͨ • issue#7630: Composer v2: Pool/Solver/Repo/Installer Tasks • ͦ΋ͦ΋ͷv2ͷݪܕͱͳΔΞΠσΟΞ͕ඳ͔Ε͍ͯΔIssue • pull#7904: Parallel downloads • ໊લͷ௨Γʂ • ࠓճͷ࿩΋͜͜ʹؚ·ΕΔ

Slide 61

Slide 61 text

ʮൈຊతʯͱ͍͑Δมߋ෦෼Λ௥͍͍ͨ • pull#7625: Separate RepositorySet from Package Pool, load only metadata of packages directly required by naderman • ʮDLͱΠϯετʔϧ(vendorσΟϨΫτϦߋ৽)ͷ෼཭ʯΛ ਐΊΔ΋ͷ • pull #8755: Add options to configure repository priorities by Seldaek • ϨϙδτϦؒͷ༏ઌ౓ΛઃఆͰ͖ΔΑ͏ʹ͢Δ΋ͷ

Slide 62

Slide 62 text

• ϦϦʔε࣌ͷϒϩάهࣄʹ͋ΔʮWhat's next?ʯ https://blog.packagist.com/composer-2-0-is-now-available/ • ͜ΕʹΑΔͱɺʮػೳతͳϩʔυϚοϓ͸·ͩ֬ఆ͍ͤͯ͞ͳ͍ʯ • PHPͷαϙʔτόʔδϣϯʹ͍ͭͯɻ v2.0ʹ͓͍ͯ͸PHP5.3+Λείʔϓͱ͕ͨ͠ɺ஗͘ͱ΋v2.2ʹͳΔ ࠒʹ͸PHP 7.1.3ͷαϙʔτΛ੾Γ͍ͨ ͜Ε͔Βઌͷ͜ͱʹ͍ͭͯ

Slide 63

Slide 63 text

§3: まとめ

Slide 64

Slide 64 text

ComposerΊͬͪΌྑ͘ͳͬͯΔ • DL଎౓΍ϝϞϦͷ࢖͍ํɺͦͷଞʹ΋৭ʑͳ෦෼Ͱؾ͕ར ͘ߋ৽΋ؚ·Ε͍ͯ·ͨ͠ʂ • جຊతʹ͸ޓ׵ੑ΋ߴ͍͸ͣͳͷͰɺະମݧͷํ͸ੋඇ͓ ࢼ͠Λɾɾʂ • ϓϥάΠϯ࡞ऀͷํʹ͸PRΛ౤͛ͯԠԉʂ

Slide 65

Slide 65 text

࠷ޙʹ • ࠓճ͸׳Ε਌͠ΜͩʮComposerʯΛ୊ࡐʹɺ ίʔυʹͱͲ·ΒͣIssue΍աڈͷϦϦʔε৘ใʹ໨Λ௨ͯ͠༡ΜͰΈ·ͨ͠ • OSSͷָ͍͠ͱ͜ΖͰ͢Ͷ • த਎Λ஌Δ͜ͱͰɺ ʮҰݟੌ͗ͯ͢༁෼͔Βͳ͍ΞϨʯʹ΋ڵຯΛ࣋ͯΔͷͰ͸ͳ͍Ͱ͠ΐ͏͔ • ͥͻɺօ͞Μ΋਎ͷճΓʹ͋ΔOSSͷίʔυΛಡΜͰ ஥ྑ͘ͳͬͯΈ͍ͯͩ͘͞ʂ

Slide 66

Slide 66 text

ご清聴 ありがとうございました