Slide 1

Slide 1 text

ステップ実⾏だけじゃない Xdebug PHP Conference Japan 2021 Hideki Kinjyo GitHub: o0h / Twitter: @o0h_ [ൃද൛]

Slide 2

Slide 2 text

Xdebugの話をします!

Slide 3

Slide 3 text

今⽇の⽬標: XdebugにSponsoringする⼈を 1⼈でも増やす! お世話になっているOSSに貢献したい

Slide 4

Slide 4 text

GitHubからどうぞ! https://github.com/sponsors/derickr

Slide 5

Slide 5 text

アイコンと名前を載せましょう

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

Xdebug、使っていますかー!

Slide 8

Slide 8 text

Xdebugͱ͍͑͹ɾɾ ステップ実⾏!

Slide 9

Slide 9 text

Xdebugͱ͍͑͹ɾɾ コードカバレッジ!

Slide 10

Slide 10 text

あたりは、とてもよく使われている機能だと思います。

Slide 11

Slide 11 text

ですが!! Xdebugにはもっと⾊々な機能があって、 普段の開発をとっても便利にしてくれる凄い⼦・・・! なのです。

Slide 12

Slide 12 text

トップページには5つの機能が! https://xdebug.org/

Slide 13

Slide 13 text

という訳で! 今回は、そんなXdebugの機能たちについて 紹介していきたいと思います!

Slide 14

Slide 14 text

͓͠ͳ͕͖ XdebugͷػೳͨͪΛ঺հ͍͖ͯ͠·͢ʂ 1. Xdebug3ͷಋೖʹ͍ͭͯͬ͘͟Γͱ 2. ։ൃϔϧύ / Development Helpers 3. ϑΝϯΫγϣϯτϨʔγϯά / Tracing 4. ϓϩϑΝΠϦϯά / Profiling 5. ίʔυΧόϨοδ / Code Coverage Analysis 6. ΨϕʔδίϨΫγϣϯ෼ੳ / GC Stats (ൃදͰ͸֓ཁ͚ͩ) 7. εςοϓ࣮ߦ / Step Debugger (ൃදͰ͸֓ཁ͚ͩ)

Slide 15

Slide 15 text

§1 Xdebug3の導⼊についてざっくりと

Slide 16

Slide 16 text

XdebugͷೖΕํ • Xdebug͸PHPͷ֦ுͰ͢ • ʮPHP֦ுͷΠϯετʔϧʯͱʮઃఆϑΝΠϧͷهड़ʯ ͕ඞཁͰ͢ʂ • Πϯετʔϧʹ͍ͭͯ͸ެࣜαΠτΛݟ·͠ΐ͏ʂ https://xdebug.org/docs/install

Slide 17

Slide 17 text

XdebugͷೖΕํ(ࢀߟྫ) ↓֤P/FͷύοέʔδϚωʔδϟΛར༻ՄೳͰ͢ • Alpine(apk): `sudo apk add php7-pecl-xdebug` • Debian(apt): `sudo apt-get install php-xdebug` • PECL: `pecl install xdebug`

Slide 18

Slide 18 text

XdebugͷೖΕํ(ࢀߟྫ2) ࢲ͕ྑ͘༡ͼͰ࢖͏Dockerfile͸͜Μͳײ͡Ͱ͢ (git clone -> docker-php-ext-install)

Slide 19

Slide 19 text

Xdebug3ͷઃఆ • Xdebug͸ɺver.3ʹͳͬͯ৭ʑͱઃఆ͕มΘΓ·ͨ͠ʂ • ෳࡶʹ๲Ε্͕ͬͯ͠·ͬͨͷͰɺεοΩϦ͍ͤͨ͞ʂ ͱ͍͏΋ͷͰ͢ • ʮࣅͨΑ͏ͳ΋ͷʯʮ࢖ΘΕ͍ͯͳ͍΋ͷʯΛ੔ཧͨ͠ ͍Ϟνϕ

Slide 20

Slide 20 text

Xdebug on the way to time traveling by Derick Rethans https://derickrethans.nl/talks/xdebug-phpmad21.pdf

Slide 21

Slide 21 text

xdebug.mode • Xdebug2Ͱ͸ɺʮ˓˓ͷػೳΛ༗ޮ/ແޮʯͱ͍͏ઃఆ߲໨͕ݸผʹ ઃ͚ΒΕ͍ͯ·ͨ͠ • Xdebug3Ͱ͸ʮ༗ޮͳmodeͷྻڍʯͱ͍͏୯Ұͷ߲໨Λར༻͠· ͢(xdebug.mode) • ʮεςοϓ࣮ߦ͠ͳ͕ΒϓϩϑΝΠϧΛऔΔʯͱ͍ͬͨڍಈʹ͸͋ ·Γࢫຯ͕͋Γ·ͤΜΑͶʁ • ʮҰॹʹ؅ཧͯ͠͠·ͬͨ΄͏͕ݟ௨͠΋ྑ͍͠ͳ͊ʯͱ

Slide 22

Slide 22 text

ʮ͜ΜͳʹεοΩϦ͠·ͨ͠ʯͷྫ • 公式の移⾏ガイドの例を⾒ると、随分とコン パクトになっていることが分かります • modeには 「off」もしくは機能を指定します • 有効値: off / develop / coverage / debug / gcstats /profile /trace • 複数の機能をカンマ区切りで複数指定可能 引⽤: Xdebug: Documentation » Xdebug 2 から 3 へのアップグレード https://xdebug.org/docs/upgrade_guide/ja

Slide 23

Slide 23 text

Xdebugͷઃఆঢ়ଶͷ֬ೝ • Ͳͷmodeʹͳ͍ͬͯΔ͔ʁͲΜͳઃఆʹͳ͍ͬͯΔ͔ʁΛ ֬ೝ͍ͨ͠Ͱ͢ΑͶ • `phpinfo()` Ͱ΋ՄೳͰ͕͢ɺ `xdebug_info()` Λར༻͢ΔͱαΫοͱ෼͔Γ΍͍͢Ͱ͢ • ઃఆɾઃఆͷσόοάʹ͍ͭͯ͸Youtubeʹ͋Δಈը͕਌੾ 参考: Xdebug 3: Diagnostics - YouTube https://www.youtube.com/watch?v=IN6ihpJSFDw

Slide 24

Slide 24 text

xdebug_info()の例 「Enabled Features」にはmodeごとのenabled/disabledが表⽰される

Slide 25

Slide 25 text

§2 開発ヘルパ / Development Helpers

Slide 26

Slide 26 text

Development Helpers ֓ཁ var_dump()΍Τϥʔ/ྫ֎৘ใͷදࣔͷڧԽͳͲ ࢖͍ํ ؔ਺͕௥Ճɾ্ॻ͖͞ΕΔ xdebug.mode develop

Slide 27

Slide 27 text

var_dump()ͷڧԽ • ඪ४ͷ `var_dump` ͷ৘ใΛڧԽ(= `xdebug_var_dump()` ͰͷΦʔόʔϩʔυ)͠·͢ • HTMLλάͷ෇༩ɺग़ྗ৘ใͷ௥Ճ

Slide 28

Slide 28 text

Τϥʔ৘ใͷڧԽ • ඪ४ͷΤϥʔϋϯυϥ/ྫ֎ϋϯυϥΛΦʔόʔϥΠυ͠ɺ දࣔ಺༰ɾܗࣜͷڧԽΛߦ͍·͢ • ελοΫτϨʔεɺϩʔΧϧม਺ͷ஋ͷදࣔ • var_dump()ʹ΋͋ͬͨΑ͏ʹʮHTMLԽʯ • ύοͱݟͰಡΈ΍͘͢ͳΔςʔϒϧ౳

Slide 29

Slide 29 text

ແޮ ༗ޮ

Slide 30

Slide 30 text

৭ʑͳઃఆ • දࣔ৘ใʹ੍͍ͭͯޚ͢ΔͨΊͷ৭ʑͳ ઃఆ͕ଘࡏ͠·͢ • ͜ͷ৔Ͱ͸ׂѪɾɾʂ • →͸ެࣜυΩϡϝϯτͷΩϟϓνϟ • ʮmodeʹؔ࿈͢Δઃఆ߲໨ʯͳͷͰɺ දࣔपΓʹؔ܎͢Δ΋ͷҎ֎΋͋Γ·͢

Slide 31

Slide 31 text

ΦϚέ: CLIͰ΋දࣔΛݟ΍͘͢ • ʮWebͩͱHTMLදࣔʹͳΔʯͱ͍͏ͷʹ͸ݴٴࡁΈͰ͢ ͕ɺ`’xdebug.cli_color`Λ༗ޮʹ͢ΔͱCLIͰ΋දࣔΛϦο νʹͰ͖·͢

Slide 32

Slide 32 text

xdebug_time_index() • ॲཧ։͔࢝Βɺίʔϧ͞ΕΔ·Ͱͷܦա࣌ؒΛऔಘ͢Δ • ͓֮͑ͯ͘ͱɺλΠϚʔ࢓ࠐΜͰ࣌ؒΛܭଌ͍ͨ࣌͠ͱ͔ ʹ࢖͑Δ͔΋

Slide 33

Slide 33 text

xdebug_get_monitored_functions() • ࢦఆ͞Εͨؔ਺(ϝιου΋Մ)ͷར༻ঢ়گΛऔಘ͢Δ • ʮͲ͜Ͱ͜ͷؔ਺͕ݺ͹Ε͍ͯΔͷ͔ͳʁʯΛ஌Γ͍ͨ࣌ ʹ • ྫ͑͹ʮdeprecatedʹ͍ͨ͠ʯʮϦϑΝΫλ͍ͨ͠ʯͱ ͖ʹ࢖͑Δʁ͔΋ʁ • ඪ४ؔ਺ͱ͔PHP֦ுͳͲɺεςοϓ࣮ߦ΍loggingΛ࢓ ࠐΊͳ͍ࡍʹ΋ίϨͳΒ࢖͑Δ

Slide 34

Slide 34 text

xdebug_get_monitored_functions()

Slide 35

Slide 35 text

ͦͷଞͷؔ਺ͨͪ • XdebugͷΠϯετʔϧ࣌ʹ௥Ճ͞ΕΔؔ਺ͷதʹ͸ɺ։ ൃମݧΛ޲্ͤ͞Δ͔΋஌Εͳ͍΋ͷؚ͕·Ε͍ͯ·͢ • ެࣜυΩϡϝϯτΛνϥݟͯ͠Έ͍ͯͩ͘͞ 参考: Xdebug: Documentation » Development Helpers#Related Settings and Functions https://xdebug.org/docs/develop#related_settings_and_functions

Slide 36

Slide 36 text

§3 ファンクショントレーシング / Tracing

Slide 37

Slide 37 text

Function Trace ֓ཁ ؔ਺ͷτϨʔε৘ใΛ෼ੳ͢Δ ࢖͍ํ `xdebug.start_with_request `ͷઃఆ΋͘͠͸`xdebug_start_trace()` Λ ༻͍ͯτϨʔεΛ։࢝͠ɺ݁ՌϑΝΠϧΛग़ྗ͢Δ xdebug.mode trace

Slide 38

Slide 38 text

ಈ࡞ྫ • ๭FWΛྫʹɺ࣮ࡍʹʮͲΜͳײ͡ͳͷʁʯͱ͍͏ྫΛ • `xdebug_start_trace()` / `xdebug_stop_trace()` ؔ਺Λར༻͠ɺ ؔ৺ͷ͋ΔՕॴ͚ͩൈ͖ग़ͯ͠ݟΔ • ʮmodeΛ༗ޮʹ͢Δ → ίʔυΛॻ͘ˠ ࣮ߦ͢Δ → ϑΝΠ ϧʹग़ྗ͞ΕΔʯͱ͍͏ྲྀΕʹͳΓ·͢ • ࠓճͷྫͰ͸ˠͷΑ͏ʹઃఆ͠·ͨ͠

Slide 39

Slide 39 text

͜͜ͷτϨʔε͕ ग़ྗ͞Ε·͢

Slide 40

Slide 40 text

ʮUNQYEFCVHUSBDFYUʯ ͱ͍͏ϑΝΠϧ͕࡞੒͞Ε·ͨ͠

Slide 41

Slide 41 text

ಈ࡞ྫ • ࣮ߦ͞ΕͨλΠϛϯά(xdebug_time_indexͷ஋) • ϝϞϦ࢖༻ྔ

Slide 42

Slide 42 text

ಈ࡞ྫ • ωετϨϕϧ • ϝιου໊

Slide 43

Slide 43 text

ͻͱ͜ͱɾɾ • `xdebug.collect_return` ΍ `xdebug.collect_assignments` Λઃఆ͢Δ͜ͱͰɺ໭Γ஋΍Ҿ਺ΛҰॹʹग़ྗ͢Δ͜ͱ͕ Ͱ͖·͢ • traceΛߦ͏ͱॏ͘ͳΔ(ʹ࣮ࡍͷύϑΥʔϚϯεΑΓ௿͘ ͳΔ)ͷͰɺॲཧͷதʹ֤εςοϓ͕઎ΊΔ૬ରతͳׂ߹Λ ݟΔͷ͕ྑ͍͔΋Ͱ͢

Slide 44

Slide 44 text

§4 プロファイリング / Profiling

Slide 45

Slide 45 text

Profiling ֓ཁ ࣮ߦঢ়گͷϓϩϑΝΠϦϯάΛߦ͏ ࢖͍ํ `xdebug.start_with_request `ͷઃఆΛ༻͍ͯ݁ՌϑΝΠϧΛग़ྗ͢Δ xdebug.mode profile

Slide 46

Slide 46 text

ಈ࡞ྫ • ࠓճͷྫͰ͸ˠͷΑ͏ʹઃఆ͠·ͨ͠ • Ճ͑ͯɺϒϥ΢β֦ுͷXdebug Helper ͰprofileΛར༻͠·͢ ͜ΕΛΠϯετʔϧ τϦΨʔ͢Δ

Slide 47

Slide 47 text

ʮUNQYEFCVHDBDIFHSJOEPVUʯ ͱ͍͏ϑΝΠϧ͕࡞੒͞Ε·ͨ͠ πʔϧΛ࢖ͬͯಡΈऔ͍͖ͬͯ·͢

Slide 48

Slide 48 text

PhpStorm Tools > Analyze Xdebug Profiler Snapshot > ੜ੒͞Εͨ grindϑΝΠϧͷࢦఆ

Slide 49

Slide 49 text

PhpStorm / Execution Statistics • ͦΕͧΕͷॲཧʹඅ΍ͨ࣌ؒ͠ɾϝ ϞϦͷ෼ੳ͕ग़དྷ·͢ • Time/Memory: ͦͷॲཧʹඅ΍͠ ͨίετ • Own Times / Memory: ݺͼग़͠ઌ Λআ͘ɺͦͷॲཧࣗମʹඅ΍ͨ͠ ίετ • Calls: ݺͼग़͞Εͨճ਺

Slide 50

Slide 50 text

PhpStorm / Callees, Callers Լ෦ʹ͋ΔྖҬͰɺ ݺͼग़͠ઌ(callee)ɾݺͼग़͠ݩ(caller)Λௐ΂Δ͜ͱ͕Ͱ͖·͢

Slide 51

Slide 51 text

PhpStorm • path mappingΛઃఆ͓͚ͯ͠ ͹ɺϓϩϑΝΠϧσʔλ͔Β ௚઀ιʔείʔυ΁ͷδϟϯ ϓ͕ՄೳͰ͢ • ಛʹॲཧ͕ॏ͍(ׂ߹͕େ͖͍) ΋ͷ͸ύοͱݟͰ෼͔ΔΑ͏ ʹͳ͍ͬͯΔͷ΋خ͍͠Ͱ͢ • ӈΩϟϓνϟͷ੨ࣈ෦෼

Slide 52

Slide 52 text

• XdebugͷυΩϡϝϯτͰ঺հ͞Ε͍ͯΔͷ͸ ʮKCacheGrind ʯʮQCacheGrindʯʮWebgrindʯ • ͦΕͧΕରԠϓϥοτϑΥʔϜ͕ҟͳΔ • ݸਓతʹ͸QCacheGrindΛ(΋)࢖͍ͬͯ·͢ • WebgrindΛ࢖ͬͨྫ͸ WEB+DB PRESS Vol.122ʹ͋Δهࣄ͕Φεεϝ ͦͷଞͷπʔϧ

Slide 53

Slide 53 text

§5 コードカバレッジ / Code Coverage Analysis

Slide 54

Slide 54 text

Code Coverage Analysis ֓ཁ ࣮ߦ͞ΕͨίʔυͷΧόϨοδ෼ੳΛߦ͏ ࢖͍ํ `xdebug_start_code_coverage()`Λ༻͍ͯ෼ੳΛ։࢝͠ɺ݁ՌϑΝΠϧ Λग़ྗ͢Δ xdebug.mode coverage

Slide 55

Slide 55 text

• جຊతʹ͸PHPUnitͰͷར༻͕ଟ͍ͱࢥ͍·͢ • ผͷ࢖͍ํͷఏҊͱͯ͠ɺʮ࣮ࡍͷಈ࡞Ͱ࢖ΘΕ͍ͯΔ ίʔυΛௐ΂Δʯͱ͍͏΋ͷ͕঺հ͞Ε͍ͯ·͢ (by Derick Rethansࢯ @YouTube) • `phpunit/php-code-coverage` Λ༻͍ͯɺϓϩμΫτίʔ υଆͰΧόϨοδͷऩूΛىಈ͢Δख๏ ಈ࡞ྫ

Slide 56

Slide 56 text

Xdebug 3: Code Coverage for Websites - YouTube https://www.youtube.com/watch?v=T9rwW-uySBE

Slide 57

Slide 57 text

Code Coverage for Websites 1. (PHPUnitファミリーの)カバレッジライブラリをイ ンスタンス化して

Slide 58

Slide 58 text

Code Coverage for Websites 2. カバレッジの取得開始のために起動して

Slide 59

Slide 59 text

Code Coverage for Websites 3. レポート出⼒処理を、shutdown functionとして実 ⾏するように登録して

Slide 60

Slide 60 text

Code Coverage for Websites 4. 今作成したファイルを、実際の処理(今回は `route.php`) に含まれるようにrequireして

Slide 61

Slide 61 text

Code Coverage for Websites 5. カバレッジが出⼒されました!!の図

Slide 62

Slide 62 text

ͻͱ͜ͱɾɾ • うまく活⽤できれば、「もう使われていないコー ド」を⼀網打尽にできそうだな〜という感じが • 要らないコードを安⼼感持って捨てられる武器に なるのは嬉しい!

Slide 63

Slide 63 text

§6 ガベージコレクション分析 / GC Stats ൃදͰ͸֓ཁ͚ͩ

Slide 64

Slide 64 text

Garbage Collection Statistics ֓ཁ ΨϕʔδίϨΫγϣϯͷ࣮ࢪঢ়گͷ෼ੳΛߦ͏ ࢖͍ํ `xdebug.start_with_request `ͷઃఆ΋͘͠͸`xdebug_start_gcstats()` Λ༻͍ͯ෼ੳΛ։࢝͠ɺ݁ՌϑΝΠϧΛग़ྗ͢Δ xdebug.mode gcstats

Slide 65

Slide 65 text

§7 ステップ実⾏ / Step Debugger ൃදͰ͸֓ཁ͚ͩ

Slide 66

Slide 66 text

Step Debugging ֓ཁ εςοϓ࣮ߦΛߦ͏ ࢖͍ํ `xdebug.start_with_request `ͷઃఆΛ͠ɺ(DBGpΫϥΠΞϯτͷ)ϒϨ ΠΫϙΠϯτઃఆ΋͘͠͸`xdebug_break()` Λ༻͍ͯεςοϓ࣮ߦΛ ߦ͏ xdebug.mode debug

Slide 67

Slide 67 text

§X まとめ

Slide 68

Slide 68 text

Xdebugʹॿ͚ΒΕ·ͨ͠ʂͱ͍͏ମݧஊ • ステップ実⾏: 初めて⾒るコードでも流れを終えると⼀気に進みます ね! • プロファイリング:「環境構築がやっと終わりました!」くらいの経 験値ほぼゼロなプロジェクトでも、パフォーマンス改善の実施に取 り組めたこともあります • カバレッジ: 「不要なコードのあぶり出し」はいつかやってみたい・・ • その他、リファクタする時などに際して⾊々と便利そうな機能をフ ル活⽤していきたいです

Slide 69

Slide 69 text

ࢀߟจݙ • WEB+DB PRESS Vol.122には 「パフォーマンスチューニングをしよう PHP 8で XdebugとWebgrindを使ってプロファイリング」 というお話が載っています • Xdebugの中の⼈(Derick Rethans⽒)が Youtubeに解説動画を投稿しています youtube.com/playlist?list=PLg9Kjjye-m1g_eXpdaifUqLqALLqZqKd4

Slide 70

Slide 70 text

• Derick Rethans⽒による、「Xdebug 3でどうしたい のか」というお話。開発段階での構想を語ったもの https://www.youtube.com/watch?v=KemV2XViUbQ ࢀߟจݙ

Slide 71

Slide 71 text

·ͱΊ • Xdebugには⾊々な機能があるよ!という話でした • 「ちょっと使っているけど、実は雰囲気で触っている」み ちいなやつありませんか? • 改めて、公式サイトや開発者のブログなどを⾒ると、新た な発⾒があるかも知れません!!

Slide 72

Slide 72 text

アイコンと名前を載せましょう

Slide 73

Slide 73 text

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