XDebug, PHP-ის დადებაგება God Mode-ით

დეველოპმენტის განუყოფელი ნაწილია ინჟინერის მიერ შექმნილი პროგრამული უზრუნველყოფისაგან ბაგების განდევნა.

დღესდღეისობით PHP-ში დადებაგების მეთოდების მრავალფეროვანი არჩევანი გვაქვს. შეგვიძლია ბევრნაირი ხელსაწყოს და ბიბლიოთეკის გამოყენება. დაწყებული echo-დან და დამთავრებული codesniffer-ებით და static analisys tool-ებით, რომლებიც გვიცავენ ბაგების გამრავლებისაგან და ასევე გვეხმარებიან მათ აღმოჩენასა და ლიკვიდაციაში.

განვიხილოთ რამოდენიმე მაგალითი ტრადიციული დადებაგების მეთოდების.

პირველი, ყველაზე მარტივი და ხშირად გამოყენებული, echo და print მეთოდი, რომელიც დაგვიბეჭდავს ჩვენს მიერ მითითებულ ცვლადს:

კი, თავის საქმეს აკეთებს. ცვლადის მნიშვნელობა ჩვენამდე მოაქვს მაგრამ, რეალურად უმეტეს შემთხვევაში დადებაგებისთვის echo-ს ან print-ის გამოყენება შეუძლებელია, რადგანაც მათ მხოლოდ მარტივი ტიპების დაბეჭდვა შეუძლიათ, როგორებიც არიან სტრინგები, მთელი რიცხვები და ათწილადები.

მომდევნო, ჩვენს დებაგირების იარაღთა არსენალში არის print_r. print_r-ს შეუძლია როგორც მარტივი ტიპის ცვლადების დაბეჭდვა ასევე კომპლექსური ცვლადებიც, როგრებიც არიან მასივები და ობიექტები:

print_r-ის მსგავსი ხელსაწყოა var_dump. var_dump-ი print_r-საგან განსხვავებით დაბეჭდილ მნიშვნელობებს ტიპებსაც უწერს:

მაგრამ დეველოპერებთა უმრავლესობა print_r -ს ანიჭებს უპირატესობას, რადგანაც უფრო კითხვადია.

თუ კი ლარაველის დეველოპერი ხარ, მაშინ შენთვის ნაცნობი იქნება Double D & Tripple D

dd — Die and Dump აღნიშნული ფუნქცია გვაძლევს საშუალებას გამოვიკვლიოთ, როგორც კომპლექსური ობიექტები ასევე მარტივი ტიპის ცვლადები, ამასთანავე dd გამოირჩევა კოხტად, ლამაზ ფერებში დაბეჭდვის საშუალებით.

ასევე, ლარაველმა შემოგვთავაზა ახალი ხელსაწყო დებაგირებისათვის,

ddd — Dump, Die and Debug რეალურად ეს ხელსაწყოც იმავეს აკეთებს, რასაც dd შვრება უბრალოდ გალამაზებულია და Stack Trace-იც აქვს თან დართული:

მაგრამ, თუ გვაქვს დიდი codebase-ი და სადღაც შეცდომაა გაპარული მაშინ რას ვშვრებით? - ვდგებით და ყოველ ნაბიჯზე var_dump-ებს და ddd-ებს ვწერთ სანამ იმ წყეულ ბაგს არ გავფაქტავთ?

ნუ, რაღა თქმა უნდა შეგვიძლია მასეც მოვიქცეთ. და ძალიან ბევრი PHP დეველოპერი მსგავსად იქცევა.

ნება მომეცით, გაგაცნოთ დერიკ რეთანსი, რომელმაც შექმნა XDebug ექსთენშენი. XDebug გვაძლევს საშუალებას გამოვიკვლიოთ ჩვენი აპლიკაცია, გამოვიყენოთ როგორც PHP Debugger, გავუკეთოთ ანალიზი, Profiling და ა.შ. მაგრამ მოდი დღეს ვისაუბროთ XDebug-ის ერთ კონკრეტულ ფუნქციონალზე, რომელიც Step Debugging-ის სახელითაა ცნობილი — “ნაბიჯ ნაბიჯ დადებაგება”.

რა არის Step Debugging?

XDebug-ის Step Debugger გვაძლევს საშუალებას, რომ ინტერაქტიულად გავაკეთოთ კოდის აღსრულება. დავსვათ Breakpoint-ები, შევაჩეროთ კოდის აღსრულება, IDE-შივე გამოვიკვლიოთ ცვლადები და ა.შ.

XDebug-ის ინსტალაციისთვის გადახედეთ ოფიციალურ დოკუმენტაციას: https://xdebug.org/docs/install

როგორ მუშაობოს Step Debugging?

რეალურად Step Debugging-ის პროცესი არის ჩვენთვის კარგად ნაცნობი კლიენტისა და სერვერის კომუნიკაციის იმპლემენტაცია.

ამ შემთხვევაში სერვერი არის ჩვენი IDE(მაგალითად: VSCode, PStorm ან Vim), რომელიც სტანდარტულად(ჩვენ თუ არ გავაკეთებთ ცვლილებას) 9003 პორტზე უსმენს http მოთხოვნებს.

ხოლო ჩვენი PHP Script-ის აღსრულების პროცესი აღიქმება ამ შემთხვევაში როგორც კლიენტი, რომელიც სერვერთან გააკეთებს კომუნიკაციას.

როდესაც ჩვენ დავაინსტალირებთ XDebug-ს, იგი ხდება PHP ინტერპრეტატორის ნაწილი.

პირველ რიგში, PHP Script აკეთებს ედიტორთან check request-ს, რომ გაიგოს 9003 პორტზე ვინმე თუ უსმენს http request-ებს ☎️

ყოველი PHP სკრიპტის აღსრულებსისას(ერთ-ერთი კონფიგურაციით), სანამ PHP ინსტრუქციების შესრულებას დაიწებს აკეთებს check request-ს. აღნიშნული request-ით xdebug-ი არკვევს 9003 პორტზე რაიმე სერვერი თუ უსმენს რექვესთებს.

თუ გაირკვა, რომ 9003 პორტზე ვიღაც(რომელიმე IDE) უსმენს რექვესთებს, შემდგომ XDebug-ი აკეთებს ახალ მოთხოვნას, Get Breakpoints, რაზეც IDE-მ უნდა უპასუხოს breakpoint-ების ჩამონათვალით რაც codebase-ში არსებობს.

როდესაც XDebug-ი breakpoint-ების შესახებ ინფორმაციას მიიღებს, მხოლოდ მაშინღა დაიწყებს PHP კოდის აღსრულებას. როდესაც PHP-ის აღსრულება მიადგება კონკრეტულ ინსტრუქციას, რომელზეც IDE-სგან იცის, რომ breakpoint-ია დასმული, დააპაუზებს კოდის აღსრულებას და გააგზავნის IDE-სთან ახალ request-ს — “აი ამ ინსტრუქციას მივადექი, შენ რომ მითხარი და აბა გისმენ, რა ვქნა ახლა?”

შემდეგ კი Debug Instruction Panel-ის მეშვეობით შეგვიძლია ჩვენთვის სასურველი მითითება მივცეთ PHP Script-ს რა გვინდა, რომ გააკეთოს.

და ასე Request & Response -ებით ხდება IDE-ისა და PHP Script-ის ურთიერთობა.

XDebug-ის კონფიგურაცია

როგორც აღვნიშნეთ დებაგირების პროცესში ორი მხარე მონაწილეობს: * Client (PHP Script Execution) * Server (IDE: VSCode, PStorm, Vim…)

შესაბამისად ჩვენ გვჭირდება ორივე მხარეს კონფიგურაციის გაკეთება.

როდესაც დავაინსტალირებთ XDebug-ს, ახალი ini ფაილი იქნება დამატებული, სადაც კონფიგურაციები უნდა შევიტანოთ:

ჩავწეროთ ტერმინალში:

php --ini

output იქნება PHP-ის ini ფაილების მისამართები, რომლიდანაც ერთ-ერთი XDebug-ს ეკუთვნის. წესით მარტივად უნდა შენიშნოთ:

თუ შევხედავთ XDebug-ის ini ფაილს, შევნიშნავთ, რომ უბრალოდ XDebug-ის ექსთენშენია გააქტიურებული:

ჩვენ დაგვჭირდება, რომ ერთი ორი კონფიგურაცია ჩავამატოთ ამ ini ფაილში:

# enables extension
zend_extension=xdebug.so

# enables step debugging feature
xdebug.mode=debug

# step debugging will be triggered# on the start of php script exection 
xdebug.start_with_request=yes

XDebug-ის კონფიგურაცია მზადაა !

შესაძლებელია, რომ სხვადასხვა development environment-ზე XDebug-ის კონფიგურაცია განსხვავდებოდეს. ეს კონკრეტული მაგალითი გათვლილია სტანდარტულ მიდგომაზე, როცა PHP Interpretator და IDE ერთ მანქანაზეა ლოკალურად. მაგალითად თუ ვაგრანტს ან დოკერს იყენებთ დეველოპმენტ პროცესში, ამ შემთხვევაში PHP ვირტუალური მანქანიდან ან კონტეინერიდან უნდა დაუკავშირდეს ლოკალურ Host მანქანაზე IDE-ის, ამ შემთხვევაში კონფიგურაცია განსხვავებული იქნება.

სანამ VSCode-ის კონფიგურაციას გავწერდეთ დარწმუნდით, რომ PHP-ის დებაგირებისთვის საჭირო ექსთენშენი დაყენებული გაქვთ VSCode-ზე: https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-debug

ახლა კი გავხსნათ ჩვენი პროექტის ფოლდერი და Ctrl+Shift+D შორთქათის მეშვეობით გამოვიძახოთ Debug Panel

მაკზე ეს შორთქათი იქნება CMD+Shift+D

create a launch.json file” ღილაკის მეშვეობით შევქმნათ VScode-ის კონფიგურაცია, რომელიც შემდეგნაირად გამოიყურება:

VSCode ჩვენს პროექტში შექმნის .vscode ფოლდერს, შემდეგ კი ამ ფოლდერში launch.json ფაილს. თავის მხრივ launch.json ფაილში სამი კონფიგურაცია გვაქვს გამზადებული. ჩვენ აქედან მხოლოდ პირველი გვჭირდება Listen for Xdebug.

მარცხნივ სტარტის ღილაკით ან F5 ქიბორდის ღილაკით შეგვიძლია Debug Server-ი გავუშვათ, რომელიც 9003 პორტზე მოუსმენს რექვესთებს:

შემდეგ კი შეგვიძლია ჩვენს codebase-ში breakpoint-ები დავსვათ და გავუშვათ PHP Script(ან PHP Server) 💪

Happy DeBugging 🤖

Last updated