{"id":230113,"date":"2022-12-04T09:21:00","date_gmt":"2022-12-04T06:21:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230113"},"modified":"2022-12-04T17:05:50","modified_gmt":"2022-12-04T14:05:50","slug":"czytanie-i-zrozumienie-dziennikow-bledow-wordpress-czesc-2","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/czytanie-i-zrozumienie-dziennikow-bledow-wordpress-czesc-2\/","title":{"rendered":"Czytanie i zrozumienie dziennik\u00f3w b\u0142\u0119d\u00f3w WordPress, cz\u0119\u015b\u0107 2"},"content":{"rendered":"\n<p><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/czytanie-i-zrozumienie-dziennikow-bledow-wordpress-czesc-1\/\" title=\"Ostatnim razem\">Ostatnim razem<\/a><\/strong> przeszli\u015bmy przez nast\u0119puj\u0105ce czynno\u015bci:<\/p>\n<ol>\n<li>konfigurowanie sta\u0142ych debugowania,<\/li>\n<li>zlokalizowanie pliku dziennika b\u0142\u0119d\u00f3w,<\/li>\n<li>zrozumienie, jak czyta\u0107 plik dziennika,<\/li>\n<li>zrozumienie \u015blad\u00f3w stosu<\/li>\n<li>zrozumienie, jak czyta\u0107 stos<\/li>\n<\/ol>\n<p>Cho\u0107 jest to mi\u0142e, nadal wa\u017cne jest, aby zrozumie\u0107, jak zapisywa\u0107 dane do dziennika b\u0142\u0119d\u00f3w z aspektu programistycznego. To jest do powiedzenia; to jedno, je\u015bli twoja praca rzuca b\u0142\u0119dy, ostrze\u017cenia lub powiadomienia.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162973-61e747bcebed4.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162973-61e747bcebed4.png\" alt=\"Czytanie i zrozumienie dziennik\u00f3w b\u0142\u0119d\u00f3w WordPress, cz\u0119\u015b\u0107 2\"><\/a><\/p>\n<p>To inna sprawa, je\u015bli chcesz zrozumie\u0107, jak r\u0119cznie zapisywa\u0107 informacje do pliku do bada\u0144 i debugowania.<\/p>\n<p>W tym po\u015bcie b\u0119dziemy kontynuowa\u0107 dok\u0142adnie to, aby lepiej zrozumie\u0107 dzienniki b\u0142\u0119d\u00f3w WordPress.<\/p>\n<h2>Zrozumienie dziennik\u00f3w b\u0142\u0119d\u00f3w WordPress, cz\u0119\u015b\u0107 2<\/h2>\n<p>Po co w og\u00f3le pisa\u0107 do dziennika b\u0142\u0119d\u00f3w? Chodzi mi o to, czy jest to nawet cz\u0119\u015b\u0107 procesu debugowania?<\/p>\n<p>Z <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/czytanie-i-zrozumienie-dziennikow-bledow-wordpress-czesc-1\/\" title=\"poprzedniego posta\">poprzedniego posta<\/a><\/strong> :<\/p>\n<blockquote>\n<p>Ale co z przypadkiem, gdy chcemy co\u015b zrzuci\u0107, aby uzyska\u0107 wgl\u0105d w to, co widzi WordPress lub PHP? To te\u017c jest przydatne.<\/p>\n<\/blockquote>\n<p>Kiedy programi\u015bci my\u015bl\u0105 o debugowaniu, wielu z nich my\u015bli o u\u017cyciu rzeczywistego debuggera (czyli kawa\u0142ka oprogramowania), ustawianiu punkt\u00f3w przerwania i przechodzeniu przez kod, aby obserwowa\u0107 warto\u015bci zmiennych podczas wykonywania programu.<\/p>\n<p>Dojdziemy do tego punktu, ale zanim to zrobimy, przyjrzyjmy si\u0119, jak sami mo\u017cemy zapisywa\u0107 w dzienniku b\u0142\u0119d\u00f3w, aby uzyska\u0107 wgl\u0105d w to, jak dzia\u0142a nasza praca.<\/p>\n<p>W ko\u0144cu to jedno, je\u015bli nasza praca polega na rzucaniu ostrze\u017ce\u0144, b\u0142\u0119d\u00f3w i powiadomie\u0144. To kolejna, je\u015bli s\u0105 informacje, kt\u00f3re chcemy zobaczy\u0107. I tu wchodzi w gr\u0119 zapisywanie do dziennika b\u0142\u0119d\u00f3w.<\/p>\n<h3>Zrozumienie funkcji PHP<\/h3>\n<p>Aby zapisywa\u0107 w dzienniku b\u0142\u0119d\u00f3w, wa\u017cne jest zrozumienie dw\u00f3ch funkcji PHP:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/secure.php.net\/manual\/en\/function.error-log.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dziennik_b\u0142\u0119d\u00f3w<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/secure.php.net\/manual\/en\/function.print-r.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">print_r<\/a><\/strong><\/li>\n<\/ol>\n<p>Je\u015bli chodzi o funkcj\u0119 error_log, zwr\u00f3\u0107 uwag\u0119, \u017ce jej celem jest:<\/p>\n<blockquote>\n<p>Wy\u015blij wiadomo\u015b\u0107 o b\u0142\u0119dzie do zdefiniowanych procedur obs\u0142ugi b\u0142\u0119d\u00f3w<\/p>\n<\/blockquote>\n<p>W wi\u0119kszo\u015bci przypadk\u00f3w jest to ustawienie zapisu do pliku dziennika za nas za pomoc\u0105 domy\u015blnej konfiguracji WordPress i PHP. Ale jest w tym co\u015b wi\u0119cej, poniewa\u017c cz\u0119sto b\u0119dziemy chcieli wypisa\u0107 warto\u015bci zmiennych, tablic, obiekt\u00f3w i tak dalej.<\/p>\n<p>W tym celu musisz mie\u0107 mo\u017cliwo\u015b\u0107 u\u017cywania <strong>print_r<\/strong> w po\u0142\u0105czeniu z <strong>error_log<\/strong>. <strong>print_r<\/strong> wykonuje nast\u0119puj\u0105ce czynno\u015bci:<\/p>\n<blockquote>\n<p>Wy\u015bwietla czytelne dla cz\u0142owieka informacje o zmiennej<\/p>\n<\/blockquote>\n<p>A je\u015bli przeczytasz podr\u0119cznik, zauwa\u017cysz, \u017ce wymaga dw\u00f3ch argument\u00f3w, z kt\u00f3rych drugi powinien by\u0107 ustawiony na <strong>true<\/strong>, je\u015bli chcesz, aby wynik funkcji zosta\u0142 wydrukowany do pliku dziennika.<\/p>\n<p>W szczeg\u00f3lno\u015bci, jak stwierdza podr\u0119cznik:<\/p>\n<blockquote>\n<p>Je\u015bli chcesz przechwyci\u0107 dane wyj\u015bciowe <strong>print_r()<\/strong>, u\u017cyj <code>return<\/code>parametru. Gdy ten parametr jest ustawiony na <strong><code>TRUE<\/code><\/strong>, <strong>print_r()<\/strong> zwr\u00f3ci informacje zamiast je wydrukowa\u0107.<\/p>\n<\/blockquote>\n<p>Og\u00f3lna idea zapisania warto\u015bci tablicy, powiedzmy $exampleArray, wygl\u0105da\u0142aby mniej wi\u0119cej <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/426e02bcfc411d43be6715b3e84ead7e#file-13-error-log-print-r-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\nerror_log(print_r($exampleArray, true));<\/code><\/pre>\n<p>Ale co w kontek\u015bcie WordPressa?<\/p>\n<h3>Zapisywanie warto\u015bci do dziennika b\u0142\u0119d\u00f3w w WordPress<\/h3>\n<p>Powy\u017csze przedstawia funkcje wbudowane w PHP, kt\u00f3rych potrzebujemy, ale jak to wygl\u0105da w kontek\u015bcie rozwoju WordPressa.<\/p>\n<p>Aby to zrobi\u0107, za\u0142\u00f3\u017cmy, \u017ce zaimplementowali\u015bmy wersj\u0119 <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/korzystanie-z-wzorca-rejestru-w-wordpress\/\" title=\"wzorca rejestru\">wzorca rejestru<\/a><\/strong>. W naszej implementacji wzorca mamy r\u00f3wnie\u017c metod\u0119 o nazwie <strong>start<\/strong>, kt\u00f3r\u0105 mo\u017cemy wywo\u0142a\u0107 po dodaniu wszystkich naszych obiekt\u00f3w do rejestru.<\/p>\n<p>Mo\u017ce wygl\u0105da\u0107 mniej wi\u0119cej <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/426e02bcfc411d43be6715b3e84ead7e#file-14-start-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Starts all of the objects stored is the registry by calling\n * the `start` method that's available on each of the objects.\n *\/\npublic function start()\n{\n    foreach ($this-&gt;storage as $obj) {\n        $obj-&gt;start();\n    }\n}<\/code><\/pre>\n<p>Teraz, je\u015bli chodzi o wdro\u017cenie, jest to proste. Ale co, je\u015bli chcemy zobaczy\u0107, jakie obiekty s\u0105 wywo\u0142ywane w ka\u017cdej iteracji p\u0119tli.<\/p>\n<p>Ide\u0105 tego jest to, \u017ce jeste\u015bmy w stanie iterowa\u0107 przez przechowywane obiekty i wywo\u0142a\u0107 metod\u0119 na ka\u017cdym z nich. Opiera si\u0119 to na za\u0142o\u017ceniu, \u017ce ka\u017cdy z obiekt\u00f3w ma dost\u0119pn\u0105 dla ka\u017cdego z nich metod\u0119 (kt\u00f3r\u0105 mo\u017cna wymusi\u0107 za pomoc\u0105 <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/programowanie-obiektowe-zrozumienie-interfejsow\/\" title=\"interfejsu\">interfejsu<\/a><\/strong> ).<\/p>\n<p>Po pierwsze, rodzi si\u0119 pytanie: dlaczego mo\u017cemy chcie\u0107 to zrobi\u0107? Ze wzgl\u0119du na charakter systemu zarz\u0105dzania zdarzeniami WordPress, by\u0107 mo\u017ce chcemy si\u0119 upewni\u0107, \u017ce ka\u017cdy obiekt, kt\u00f3ry ma zosta\u0107 uruchomiony, zostanie uruchomiony.<\/p>\n<p>Po drugie, jak mo\u017cemy zobaczy\u0107, jakie obiekty s\u0105 przywo\u0142ywane? Tutaj wchodzi w gr\u0119 zapisywanie do dziennika b\u0142\u0119d\u00f3w. Korzystaj\u0105c z metod, kt\u00f3re opisali\u015bmy powy\u017cej, jednym ze sposob\u00f3w na to by\u0142oby wykonanie <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/426e02bcfc411d43be6715b3e84ead7e#file-15-view-stored-objects-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nast\u0119puj\u0105cych czynno\u015bci<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Starts all of the objects stored is the registry by calling\n * the `start` method that's available on each of the objects.\n *\/\npublic function start()\n{\n    foreach ($this-&gt;storage as $obj) {\n        error_log(print_r($obj, true));\n        $obj-&gt;start();\n    }\n}<\/code><\/pre>\n<p>Spowoduje to nast\u0119puj\u0105ce dane wyj\u015bciowe:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162973-61e747c0a5923.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162973-61e747c0a5923.png\" alt=\"Czytanie i zrozumienie dziennik\u00f3w b\u0142\u0119d\u00f3w WordPress, cz\u0119\u015b\u0107 2\"><\/a><\/p>\n<p>Tutaj mo\u017cesz zobaczy\u0107 przedmiot; jest to przestrze\u0144 nazw, to warto\u015bci w\u0142a\u015bciwo\u015bci (w tym, czy w\u0142a\u015bciwo\u015bci s\u0105 prywatne, chronione, publiczne itd.).<\/p>\n<p>Stamt\u0105d mo\u017cesz wykona\u0107 troch\u0119 debugowania, je\u015bli dane wyj\u015bciowe s\u0105 takie, jakich si\u0119 nie spodziewa\u0142e\u015b, lub mo\u017ce mo\u017cesz u\u017cy\u0107 tego do sprawdzenia, czy Tw\u00f3j kod robi to, czego oczekiwa\u0142e\u015b.<\/p>\n<p>To tylko jeden przyk\u0142ad. Mo\u017cesz jednak zrzuci\u0107 warto\u015bci zmiennej <strong>$storage<\/strong>, zanim jeszcze przejdziesz przez p\u0119tl\u0119. Ten wyb\u00f3r zale\u017cy od Ciebie i tego, co chcesz osi\u0105gn\u0105\u0107.<\/p>\n<h2>Korzystanie z zainstalowanych wtyczek<\/h2>\n<p>W tym momencie om\u00f3wili\u015bmy podstawowe aspekty debugowania kodu za pomoc\u0105 dziennik\u00f3w b\u0142\u0119d\u00f3w.<\/p>\n<p>Teraz jednak musimy zwr\u00f3ci\u0107 uwag\u0119 na wtyczki, kt\u00f3re zosta\u0142y om\u00f3wione kilka post\u00f3w temu. Potem w ko\u0144cu b\u0119dziemy pracowa\u0107 nad Xdebug.<\/p>\n<p>Ale nast\u0119pnie przyjrzymy si\u0119 dost\u0119pnym narz\u0119dziom z samego WordPressa.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>To inna sprawa, je\u015bli chcesz zrozumie\u0107, jak r\u0119cznie zapisywa\u0107 informacje do pliku w celach badawczych i debugowania. W tym po\u015bcie b\u0119dziemy kontynuowa\u0107 dok\u0142adnie to, aby lepiej zrozumie\u0107 dzienniki b\u0142\u0119d\u00f3w WordPress.<\/p>\n","protected":false},"author":1,"featured_media":162974,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,845],"tags":[1169],"class_list":["post-230113","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-samouczki","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=230113"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230113\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/162974"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}