PHP Conference Japan 2021での発表資料です
https://fortee.jp/phpcon-2021/proposal/3ed8a69b-8618-4644-9a8c-655505078743
ステップ実⾏だけじゃないXdebugPHP Conference Japan 2021Hideki KinjyoGitHub: o0h / Twitter: @o0h_[ൃද൛]
View Slide
Xdebugの話をします!
今⽇の⽬標:XdebugにSponsoringする⼈を1⼈でも増やす!お世話になっているOSSに貢献したい
GitHubからどうぞ!https://github.com/sponsors/derickr
アイコンと名前を載せましょう
ࣗݾհ• ⾦城秀樹 / きんじょうひでき• GitHub: @o0h / Twitter: @o0h_• 好きなFWはCakePHP• アイコンは美味しい鮭親⼦丼の写真です
Xdebug、使っていますかー!
Xdebugͱ͍͑ɾɾステップ実⾏!
Xdebugͱ͍͑ɾɾコードカバレッジ!
あたりは、とてもよく使われている機能だと思います。
ですが!!Xdebugにはもっと⾊々な機能があって、普段の開発をとっても便利にしてくれる凄い⼦・・・!なのです。
トップページには5つの機能が!https://xdebug.org/
という訳で!今回は、そんなXdebugの機能たちについて紹介していきたいと思います!
͓͠ͳ͕͖XdebugͷػೳͨͪΛհ͍͖ͯ͠·͢ʂ1. Xdebug3ͷಋೖʹ͍ͭͯͬ͘͟Γͱ2. ։ൃϔϧύ / Development Helpers3. ϑΝϯΫγϣϯτϨʔγϯά / Tracing4. ϓϩϑΝΠϦϯά / Profiling5. ίʔυΧόϨοδ / Code Coverage Analysis6. ΨϕʔδίϨΫγϣϯੳ / GC Stats (ൃදͰ֓ཁ͚ͩ)7. εςοϓ࣮ߦ / Step Debugger (ൃදͰ֓ཁ͚ͩ)
§1Xdebug3の導⼊についてざっくりと
XdebugͷೖΕํ• XdebugPHPͷ֦ுͰ͢• ʮPHP֦ுͷΠϯετʔϧʯͱʮઃఆϑΝΠϧͷهड़ʯ͕ඞཁͰ͢ʂ• Πϯετʔϧʹ͍ͭͯެࣜαΠτΛݟ·͠ΐ͏ʂhttps://xdebug.org/docs/install
XdebugͷೖΕํ(ࢀߟྫ)↓֤P/FͷύοέʔδϚωʔδϟΛར༻ՄೳͰ͢• Alpine(apk): `sudo apk add php7-pecl-xdebug`• Debian(apt): `sudo apt-get install php-xdebug`• PECL: `pecl install xdebug`
XdebugͷೖΕํ(ࢀߟྫ2)ࢲ͕ྑ͘༡ͼͰ͏Dockerfile͜Μͳײ͡Ͱ͢(git clone -> docker-php-ext-install)
Xdebug3ͷઃఆ• Xdebugɺver.3ʹͳͬͯ৭ʑͱઃఆ͕มΘΓ·ͨ͠ʂ• ෳࡶʹΕ্͕ͬͯ͠·ͬͨͷͰɺεοΩϦ͍ͤͨ͞ʂͱ͍͏ͷͰ͢• ʮࣅͨΑ͏ͳͷʯʮΘΕ͍ͯͳ͍ͷʯΛཧ͍ͨ͠Ϟνϕ
Xdebug on the way to time travelingby Derick Rethanshttps://derickrethans.nl/talks/xdebug-phpmad21.pdf
xdebug.mode• Xdebug2Ͱɺʮ˓˓ͷػೳΛ༗ޮ/ແޮʯͱ͍͏ઃఆ߲͕ݸผʹઃ͚ΒΕ͍ͯ·ͨ͠• Xdebug3Ͱʮ༗ޮͳmodeͷྻڍʯͱ͍͏୯Ұͷ߲Λར༻͠·͢(xdebug.mode)• ʮεςοϓ࣮ߦ͠ͳ͕ΒϓϩϑΝΠϧΛऔΔʯͱ͍ͬͨڍಈʹ͋·Γࢫຯ͕͋Γ·ͤΜΑͶʁ• ʮҰॹʹཧͯ͠͠·ͬͨ΄͏͕ݟ௨͠ྑ͍͠ͳ͊ʯͱ
ʮ͜ΜͳʹεοΩϦ͠·ͨ͠ʯͷྫ• 公式の移⾏ガイドの例を⾒ると、随分とコンパクトになっていることが分かります• modeには 「off」もしくは機能を指定します• 有効値: off / develop / coverage / debug /gcstats /profile /trace• 複数の機能をカンマ区切りで複数指定可能引⽤: Xdebug: Documentation » Xdebug 2 から 3 へのアップグレードhttps://xdebug.org/docs/upgrade_guide/ja
Xdebugͷઃఆঢ়ଶͷ֬ೝ• Ͳͷmodeʹͳ͍ͬͯΔ͔ʁͲΜͳઃఆʹͳ͍ͬͯΔ͔ʁΛ֬ೝ͍ͨ͠Ͱ͢ΑͶ• `phpinfo()` ͰՄೳͰ͕͢ɺ`xdebug_info()` Λར༻͢ΔͱαΫοͱ͔Γ͍͢Ͱ͢• ઃఆɾઃఆͷσόοάʹ͍ͭͯYoutubeʹ͋Δಈը͕参考: Xdebug 3: Diagnostics - YouTubehttps://www.youtube.com/watch?v=IN6ihpJSFDw
xdebug_info()の例「Enabled Features」にはmodeごとのenabled/disabledが表⽰される
§2開発ヘルパ / Development Helpers
Development Helpers֓ཁvar_dump()Τϥʔ/ྫ֎ใͷදࣔͷڧԽͳͲ͍ํ͕ؔՃɾ্ॻ͖͞ΕΔxdebug.modedevelop
var_dump()ͷڧԽ• ඪ४ͷ `var_dump` ͷใΛڧԽ(= `xdebug_var_dump()`ͰͷΦʔόʔϩʔυ)͠·͢• HTMLλάͷ༩ɺग़ྗใͷՃ
ΤϥʔใͷڧԽ• ඪ४ͷΤϥʔϋϯυϥ/ྫ֎ϋϯυϥΛΦʔόʔϥΠυ͠ɺදࣔ༰ɾܗࣜͷڧԽΛߦ͍·͢• ελοΫτϨʔεɺϩʔΧϧมͷͷදࣔ• var_dump()ʹ͋ͬͨΑ͏ʹʮHTMLԽʯ• ύοͱݟͰಡΈ͘͢ͳΔςʔϒϧ
ແޮ༗ޮ
৭ʑͳઃఆ• දࣔใʹ੍͍ͭͯޚ͢ΔͨΊͷ৭ʑͳઃఆ͕ଘࡏ͠·͢• ͜ͷͰׂѪɾɾʂ• →ެࣜυΩϡϝϯτͷΩϟϓνϟ• ʮmodeʹؔ࿈͢Δઃఆ߲ʯͳͷͰɺදࣔपΓʹؔ͢ΔͷҎ֎͋Γ·͢
ΦϚέ: CLIͰදࣔΛݟ͘͢• ʮWebͩͱHTMLදࣔʹͳΔʯͱ͍͏ͷʹݴٴࡁΈͰ͕͢ɺ`’xdebug.cli_color`Λ༗ޮʹ͢ΔͱCLIͰදࣔΛϦονʹͰ͖·͢
xdebug_time_index()• ॲཧ։͔࢝Βɺίʔϧ͞ΕΔ·Ͱͷܦա࣌ؒΛऔಘ͢Δ• ͓֮͑ͯ͘ͱɺλΠϚʔࠐΜͰ࣌ؒΛܭଌ͍ͨ࣌͠ͱ͔ʹ͑Δ͔
xdebug_get_monitored_functions()• ࢦఆ͞Εͨؔ(ϝιουՄ)ͷར༻ঢ়گΛऔಘ͢Δ• ʮͲ͜Ͱ͜ͷ͕ؔݺΕ͍ͯΔͷ͔ͳʁʯΛΓ͍ͨ࣌ʹ• ྫ͑ʮdeprecatedʹ͍ͨ͠ʯʮϦϑΝΫλ͍ͨ͠ʯͱ͖ʹ͑Δʁ͔ʁ• ඪ४ؔͱ͔PHP֦ுͳͲɺεςοϓ࣮ߦloggingΛࠐΊͳ͍ࡍʹίϨͳΒ͑Δ
xdebug_get_monitored_functions()
ͦͷଞͷؔͨͪ• XdebugͷΠϯετʔϧ࣌ʹՃ͞ΕΔؔͷதʹɺ։ൃମݧΛ্ͤ͞Δ͔Εͳ͍ͷؚ͕·Ε͍ͯ·͢• ެࣜυΩϡϝϯτΛνϥݟͯ͠Έ͍ͯͩ͘͞参考: Xdebug: Documentation » Development Helpers#Related Settings and Functionshttps://xdebug.org/docs/develop#related_settings_and_functions
§3ファンクショントレーシング / Tracing
Function Trace֓ཁؔͷτϨʔεใΛੳ͢Δ͍ํ`xdebug.start_with_request `ͷઃఆ͘͠`xdebug_start_trace()` Λ༻͍ͯτϨʔεΛ։࢝͠ɺ݁ՌϑΝΠϧΛग़ྗ͢Δxdebug.modetrace
ಈ࡞ྫ• FWΛྫʹɺ࣮ࡍʹʮͲΜͳײ͡ͳͷʁʯͱ͍͏ྫΛ• `xdebug_start_trace()` / `xdebug_stop_trace()` ؔΛར༻͠ɺؔ৺ͷ͋ΔՕॴ͚ͩൈ͖ग़ͯ͠ݟΔ• ʮmodeΛ༗ޮʹ͢Δ → ίʔυΛॻ͘ˠ ࣮ߦ͢Δ → ϑΝΠϧʹग़ྗ͞ΕΔʯͱ͍͏ྲྀΕʹͳΓ·͢• ࠓճͷྫͰˠͷΑ͏ʹઃఆ͠·ͨ͠
͜͜ͷτϨʔε͕ग़ྗ͞Ε·͢
ʮUNQYEFCVHUSBDFYUʯͱ͍͏ϑΝΠϧ͕࡞͞Ε·ͨ͠
ಈ࡞ྫ• ࣮ߦ͞ΕͨλΠϛϯά(xdebug_time_indexͷ)• ϝϞϦ༻ྔ
ಈ࡞ྫ• ωετϨϕϧ• ϝιου໊
ͻͱ͜ͱɾɾ• `xdebug.collect_return` `xdebug.collect_assignments`Λઃఆ͢Δ͜ͱͰɺΓҾΛҰॹʹग़ྗ͢Δ͜ͱ͕Ͱ͖·͢• traceΛߦ͏ͱॏ͘ͳΔ(ʹ࣮ࡍͷύϑΥʔϚϯεΑΓ͘ͳΔ)ͷͰɺॲཧͷதʹ֤εςοϓ͕ΊΔ૬ରతͳׂ߹ΛݟΔͷ͕ྑ͍͔Ͱ͢
§4プロファイリング / Profiling
Profiling֓ཁ࣮ߦঢ়گͷϓϩϑΝΠϦϯάΛߦ͏͍ํ`xdebug.start_with_request `ͷઃఆΛ༻͍ͯ݁ՌϑΝΠϧΛग़ྗ͢Δxdebug.modeprofile
ಈ࡞ྫ• ࠓճͷྫͰˠͷΑ͏ʹઃఆ͠·ͨ͠• Ճ͑ͯɺϒϥβ֦ுͷXdebug HelperͰprofileΛར༻͠·͢͜ΕΛΠϯετʔϧ τϦΨʔ͢Δ
ʮUNQYEFCVHDBDIFHSJOEPVUʯͱ͍͏ϑΝΠϧ͕࡞͞Ε·ͨ͠πʔϧΛͬͯಡΈऔ͍͖ͬͯ·͢
PhpStormTools > Analyze Xdebug Profiler Snapshot > ੜ͞ΕͨgrindϑΝΠϧͷࢦఆ
PhpStorm / Execution Statistics• ͦΕͧΕͷॲཧʹඅͨ࣌ؒ͠ɾϝϞϦͷੳ͕ग़དྷ·͢• Time/Memory: ͦͷॲཧʹඅͨ͠ίετ• Own Times / Memory: ݺͼग़͠ઌΛআ͘ɺͦͷॲཧࣗମʹඅͨ͠ίετ• Calls: ݺͼग़͞Εͨճ
PhpStorm / Callees, CallersԼ෦ʹ͋ΔྖҬͰɺݺͼग़͠ઌ(callee)ɾݺͼग़͠ݩ(caller)ΛௐΔ͜ͱ͕Ͱ͖·͢
PhpStorm• path mappingΛઃఆ͓͚ͯ͠ɺϓϩϑΝΠϧσʔλ͔Βιʔείʔυͷδϟϯϓ͕ՄೳͰ͢• ಛʹॲཧ͕ॏ͍(ׂ߹͕େ͖͍)ͷύοͱݟͰ͔ΔΑ͏ʹͳ͍ͬͯΔͷخ͍͠Ͱ͢• ӈΩϟϓνϟͷ੨ࣈ෦
• XdebugͷυΩϡϝϯτͰհ͞Ε͍ͯΔͷʮKCacheGrind ʯʮQCacheGrindʯʮWebgrindʯ• ͦΕͧΕରԠϓϥοτϑΥʔϜ͕ҟͳΔ• ݸਓతʹQCacheGrindΛ()͍ͬͯ·͢• WebgrindΛͬͨྫWEB+DB PRESS Vol.122ʹ͋Δهࣄ͕Φεεϝͦͷଞͷπʔϧ
§5コードカバレッジ / Code Coverage Analysis
Code Coverage Analysis֓ཁ࣮ߦ͞ΕͨίʔυͷΧόϨοδੳΛߦ͏͍ํ`xdebug_start_code_coverage()`Λ༻͍ͯੳΛ։࢝͠ɺ݁ՌϑΝΠϧΛग़ྗ͢Δxdebug.modecoverage
• جຊతʹPHPUnitͰͷར༻͕ଟ͍ͱࢥ͍·͢• ผͷ͍ํͷఏҊͱͯ͠ɺʮ࣮ࡍͷಈ࡞ͰΘΕ͍ͯΔίʔυΛௐΔʯͱ͍͏ͷ͕հ͞Ε͍ͯ·͢(by Derick Rethansࢯ @YouTube)• `phpunit/php-code-coverage` Λ༻͍ͯɺϓϩμΫτίʔυଆͰΧόϨοδͷऩूΛىಈ͢Δख๏ಈ࡞ྫ
Xdebug 3: Code Coverage for Websites - YouTubehttps://www.youtube.com/watch?v=T9rwW-uySBE
Code Coverage for Websites1. (PHPUnitファミリーの)カバレッジライブラリをインスタンス化して
Code Coverage for Websites2. カバレッジの取得開始のために起動して
Code Coverage for Websites3. レポート出⼒処理を、shutdown functionとして実⾏するように登録して
Code Coverage for Websites4. 今作成したファイルを、実際の処理(今回は `route.php`)に含まれるようにrequireして
Code Coverage for Websites5. カバレッジが出⼒されました!!の図
ͻͱ͜ͱɾɾ• うまく活⽤できれば、「もう使われていないコード」を⼀網打尽にできそうだな〜という感じが• 要らないコードを安⼼感持って捨てられる武器になるのは嬉しい!
§6ガベージコレクション分析 / GC StatsൃදͰ֓ཁ͚ͩ
Garbage Collection Statistics֓ཁΨϕʔδίϨΫγϣϯͷ࣮ࢪঢ়گͷੳΛߦ͏͍ํ`xdebug.start_with_request `ͷઃఆ͘͠`xdebug_start_gcstats()`Λ༻͍ͯੳΛ։࢝͠ɺ݁ՌϑΝΠϧΛग़ྗ͢Δxdebug.modegcstats
§7ステップ実⾏ / Step DebuggerൃදͰ֓ཁ͚ͩ
Step Debugging֓ཁεςοϓ࣮ߦΛߦ͏͍ํ`xdebug.start_with_request `ͷઃఆΛ͠ɺ(DBGpΫϥΠΞϯτͷ)ϒϨΠΫϙΠϯτઃఆ͘͠`xdebug_break()` Λ༻͍ͯεςοϓ࣮ߦΛߦ͏xdebug.modedebug
§Xまとめ
Xdebugʹॿ͚ΒΕ·ͨ͠ʂͱ͍͏ମݧஊ• ステップ実⾏: 初めて⾒るコードでも流れを終えると⼀気に進みますね!• プロファイリング:「環境構築がやっと終わりました!」くらいの経験値ほぼゼロなプロジェクトでも、パフォーマンス改善の実施に取り組めたこともあります• カバレッジ: 「不要なコードのあぶり出し」はいつかやってみたい・・• その他、リファクタする時などに際して⾊々と便利そうな機能をフル活⽤していきたいです
ࢀߟจݙ• WEB+DB PRESS Vol.122には「パフォーマンスチューニングをしよう PHP 8でXdebugとWebgrindを使ってプロファイリング」というお話が載っています• Xdebugの中の⼈(Derick Rethans⽒)がYoutubeに解説動画を投稿していますyoutube.com/playlist?list=PLg9Kjjye-m1g_eXpdaifUqLqALLqZqKd4
• Derick Rethans⽒による、「Xdebug 3でどうしたいのか」というお話。開発段階での構想を語ったものhttps://www.youtube.com/watch?v=KemV2XViUbQࢀߟจݙ
·ͱΊ• Xdebugには⾊々な機能があるよ!という話でした• 「ちょっと使っているけど、実は雰囲気で触っている」みちいなやつありませんか?• 改めて、公式サイトや開発者のブログなどを⾒ると、新たな発⾒があるかも知れません!!
ご清聴ありがとうございました🎉