{"id":230104,"date":"2022-12-04T17:02:00","date_gmt":"2022-12-04T14:02:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230104"},"modified":"2022-12-04T17:05:37","modified_gmt":"2022-12-04T14:05:37","slug":"czytanie-i-zrozumienie-dziennikow-bledow-wordpress-czesc-1","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/czytanie-i-zrozumienie-dziennikow-bledow-wordpress-czesc-1\/","title":{"rendered":"Czytanie i zrozumienie dziennik\u00f3w b\u0142\u0119d\u00f3w WordPress, cz\u0119\u015b\u0107 1"},"content":{"rendered":"\n<p>Kontynuuj\u0105c przygl\u0105danie si\u0119, co to znaczy by\u0107 <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/the-independent-wordpress-developer\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">niezale\u017cnym programist\u0105 WordPressa<\/a><\/strong>, potrzebnymi narz\u0119dziami i r\u00f3\u017cnymi strategiami, kt\u00f3re mog\u0105 poprawi\u0107 nasz zestaw umiej\u0119tno\u015bci, omawia\u0142em r\u00f3\u017cne sta\u0142e, wtyczki i narz\u0119dzia, kt\u00f3re mog\u0105 nam pom\u00f3c.<\/p>\n<p>Je\u015bli po prostu natkniesz si\u0119 na ten post, polecam zapoznanie si\u0119 z <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/natywne-narzedzia-do-debugowania-wordpress-ktore-nie-wymagaja-ide\/\" title=\"moim przewodnikiem po natywnych narz\u0119dziach do debugowania WordPressa,\">moim przewodnikiem po natywnych narz\u0119dziach do debugowania WordPressa,<\/a><\/strong> a tak\u017ce z reszt\u0105 dotychczasowych post\u00f3w z serii <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/the-independent-wordpress-developer\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">.<\/a><\/strong><\/p>\n<p>W ko\u0144cu uwa\u017cam, \u017ce wa\u017cne jest, aby\u015bmy wszyscy pracowali na tym samym fundamencie \u2013 lub czym\u015b blisko spokrewnionym \u2013 kiedy przegl\u0105damy te informacje.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163025-61e7490c88078.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-163025-61e7490c88078.png\" alt=\"Czytanie i zrozumienie dziennik\u00f3w b\u0142\u0119d\u00f3w WordPress, cz\u0119\u015b\u0107 1\"><\/a><\/p>\n<p>Ostatecznie u\u017cycie narz\u0119dzia takiego jak <strong><a href=\"https:\/\/xdebug.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Xdebug<\/a><\/strong> jest nieodzowne, ale musimy do tego dopracowa\u0107 (dla ciekawskich <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/korzystanie-z-xdebug-z-usluga-valet-i-wordpress\/\" title=\"napisa\u0142em na\">napisa\u0142em na<\/a><\/strong> ten temat kr\u00f3tki przewodnik nieco ponad rok temu).<\/p>\n<p>Na razie jednak zacznijmy od podstaw. W poprzednim po\u015bcie wyszed\u0142em z nast\u0119puj\u0105cym o\u015bwiadczeniem:<\/p>\n<blockquote>\n<p>W nast\u0119pnym po\u015bcie zaczniemy zastanawia\u0107 si\u0119, co jest konieczne, aby sprawdzi\u0107 dziennik b\u0142\u0119d\u00f3w generowany przez WordPress i jak zrozumie\u0107 wy\u015bwietlane informacje.<\/p>\n<\/blockquote>\n<p>I to jest to, na co chc\u0119 dzisiaj spojrze\u0107, poniewa\u017c, je\u015bli nic wi\u0119cej, to da ci co\u015b praktycznego, nad czym mo\u017cesz pracowa\u0107.<\/p>\n<h2>Zrozumienie dziennik\u00f3w b\u0142\u0119d\u00f3w WordPress, cz\u0119\u015b\u0107 1<\/h2>\n<p>Zanim zag\u0142\u0119bi\u0119 si\u0119 w to zbyt daleko, chc\u0119 odpowiedzie\u0107 na jedno pytanie, kt\u00f3re zosta\u0142o zadane przez cz\u0142onka witryny.<\/p>\n<p>Mianowicie zapytano mnie:<\/p>\n<blockquote>\n<p>Kiedy przyjrzymy si\u0119 zasadom obiektowym?<\/p>\n<\/blockquote>\n<p>Chocia\u017c om\u00f3wi\u0142em to troch\u0119 <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">w poprzedniej serii<\/a><\/strong>, to jest co\u015b, nad czym pracuj\u0119 bardziej szczeg\u00f3\u0142owo w dalszej cz\u0119\u015bci tej serii.<\/p>\n<p>Maj\u0105c to na uwadze, zacznijmy jednak przegl\u0105da\u0107 dzienniki b\u0142\u0119d\u00f3w.<\/p>\n<h3>Konfiguracja sta\u0142ych<\/h3>\n<p>Je\u015bli nie skonfigurowa\u0142e\u015b sta\u0142ych w swoim pliku <strong>wp-config.php<\/strong>, polecam zrobi\u0107 to teraz, poniewa\u017c zapewni to najwy\u017cszy poziom szczeg\u00f3\u0142owo\u015bci podczas badania wszelkich problem\u00f3w, kt\u00f3re mog\u0105 si\u0119 pojawi\u0107.<\/p>\n<p>Je\u015bli nie nadrobi\u0142e\u015b zaleg\u0142o\u015bci, koniecznie przeczytaj <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/natywne-narzedzia-do-debugowania-wordpress-ktore-nie-wymagaja-ide\/\" title=\"ten post\">ten post<\/a><\/strong> (a je\u015bli tak, upewnij si\u0119, \u017ce w twoim pliku konfiguracyjnym s\u0105 zdefiniowane <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/426e02bcfc411d43be6715b3e84ead7e#file-11-wp-config-debug-full-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nast\u0119puj\u0105ce sta\u0142e ):<\/a><\/strong><\/p>\n<pre><code>&lt;?php\ndefine( 'WP_DEBUG', true );\ndefine( 'WP_DEBUG_LOG', true );\ndefine( 'WP_DEBUG_DISPLAY', true );\n@ini_set( 'display_errors', 1 );\ndefine( 'SCRIPT_DEBUG', true );\ndefine( 'SAVEQUERIES', true );<\/code><\/pre>\n<p>Po ich wprowadzeniu masz wszystko, czego potrzebujesz, aby nie tylko widzie\u0107 informacje na ekranie, ale tak\u017ce w dzienniku debugowania, kt\u00f3ry wygeneruje WordPress.<\/p>\n<h3>Gdzie jest dziennik?<\/h3>\n<p>W zale\u017cno\u015bci od charakteru Twojego \u015brodowiska mo\u017ce si\u0119 to r\u00f3\u017cni\u0107; <strong>jednak w wi\u0119kszo\u015bci przypadk\u00f3w debug.log<\/strong> znajdziesz w katalogu <strong>wp-content<\/strong> znajduj\u0105cym si\u0119 nad katalogami <strong>plugins<\/strong>, <strong>theme<\/strong> i <strong>uploads<\/strong>.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163025-61e74910d3457.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-163025-61e74910d3457.png\" alt=\"Czytanie i zrozumienie dziennik\u00f3w b\u0142\u0119d\u00f3w WordPress, cz\u0119\u015b\u0107 1\"><\/a><\/p>\n<p>Jak wida\u0107 na podgl\u0105dzie powy\u017cszego zrzutu ekranu, m\u00f3j plik debugowania zawiera du\u017co tre\u015bci. Przyjrzymy si\u0119 temu bardziej szczeg\u00f3\u0142owo w nast\u0119pnej sekcji, a tak\u017ce jak to zrozumie\u0107. W mi\u0119dzyczasie sprawd\u017a, czy ten plik w og\u00f3le istnieje. Je\u015bli tak, mo\u017cesz \u015bmia\u0142o przejrze\u0107 zawarto\u015b\u0107 pliku. Mo\u017cesz lub nie rozumiesz wiele z tego, co si\u0119 dzieje, ale zawarto\u015b\u0107 pliku oznacza, \u017ce \u200b\u200bco\u015b w motywie lub wtyczce wyzwala r\u00f3\u017cne <strong><a href=\"https:\/\/secure.php.net\/manual\/en\/function.error-reporting.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ostrze\u017cenia, powiadomienia i b\u0142\u0119dy PHP,<\/a><\/strong> kt\u00f3re WordPress przechwytuje i zrzuca do pliku dziennika.<\/p>\n<h3>Co nawet oznacza plik dziennika?<\/h3>\n<p>Niekoniecznie oznacza to, \u017ce co\u015b jest zepsute, ale oznacza, \u017ce \u200b\u200bco\u015b nie dzia\u0142a tak, jak powinno, nie jest prawid\u0142owo przechwytywane i obs\u0142ugiwane na poziomie programistycznym lub po prostu robi co\u015b, czego nie powinno.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163025-61e749148c865.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-163025-61e749148c865.png\" alt=\"Czytanie i zrozumienie dziennik\u00f3w b\u0142\u0119d\u00f3w WordPress, cz\u0119\u015b\u0107 1\"><\/a><\/p>\n<p>Nie musi tak wygl\u0105da\u0107 (ale mo\u017ce!).<\/p>\n<p>Jako programi\u015bci powinni\u015bmy d\u0105\u017cy\u0107 do tego, aby nasz kod nie generowa\u0142 niczego, co by\u0142oby zapisane w dzienniku b\u0142\u0119d\u00f3w.<\/p>\n<p>Robienie tego w fazie rozwoju to jedno, poniewa\u017c jeste\u015bmy w stanie uzyska\u0107 wgl\u0105d w to, co robimy i jak dzia\u0142a WordPress. To jednak inna sprawa, \u017ce \u200b\u200bco\u015b, co wydajemy na poziomie produkcyjnym, generuje takie rzeczy.<\/p>\n<h3>Odczytywanie dziennika b\u0142\u0119d\u00f3w<\/h3>\n<p>Oczywi\u015bcie, czytanie dziennika b\u0142\u0119d\u00f3w to co\u015b wi\u0119cej ni\u017c tylko jego otwieranie. Dla wielu pierwsze wra\u017cenie jest takie, \u017ce mo\u017ce to by\u0107 mn\u00f3stwo \u017cargonu. To te\u017c rozumiem. Ale kiedy zrozumiesz, co ci pokazuje, znacznie \u0142atwiej to zrozumie\u0107.<\/p>\n<p>Sp\u00f3jrzmy wi\u0119c na naprawd\u0119 prosty przyk\u0142ad. To te\u017c nie jest wymy\u015blony przyk\u0142ad. W\u0142a\u015bciwie to pochodzi z wtyczki, nad kt\u00f3r\u0105 pracowa\u0142em. Dziennik b\u0142\u0119d\u00f3w zawiera <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/426e02bcfc411d43be6715b3e84ead7e#file-12-error-log-example-1-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nast\u0119puj\u0105ce informacje<\/a><\/strong> :<\/p>\n<pre><code>[05-Jul-2018 19:43:53 UTC] PHP Fatal error:  Uncaught Error: Class 'EasyEmailExportAdminEmailExportSubmenu' not found in \/Users\/tommcfarlin\/Dropbox\/Projects\/trunk\/wp-content\/plugins\/easy-email-export\/easy-email-export.php:37\n#8 \/U in \/Users\/tommcfarlin\/Dropbox\/Projects\/trunk\/wp-content\/plugins\/easy-email-export\/easy-email-export.php on line 37\n[05-Jul-2018 19:44:03 UTC] PHP Warning:  include_once(.\/src\/Admin\/EmailExportSubmenu.php): failed to open stream: No such file or directory in \/Users\/tommcfarlin\/Dropbox\/Projects\/trunk\/wp-content\/plugins\/easy-email-export\/easy-email-export.php on line 25\n[05-Jul-2018 19:44:03 UTC] PHP Warning:  include_once(): Failed opening '.\/src\/Admin\/EmailExportSubmenu.php' for inclusion (include_path='.:\/usr\/local\/Cellar\/php\/7.2.5\/share\/php\/pear') in \/Users\/tommcfarlin\/Dropbox\/Projects\/trunk\/wp-content\/plugins\/easy-email-export\/easy-email-export.php on line 25<\/code><\/pre>\n<p>Zauwa\u017c, \u017ce w powy\u017cszym tek\u015bcie znajduj\u0105 si\u0119 trzy linie. Najlepszym sposobem post\u0119powania podczas czytania dziennik\u00f3w b\u0142\u0119d\u00f3w jest rozpocz\u0119cie od do\u0142u i p\u00f3j\u015bcie w g\u00f3r\u0119. Dzieje si\u0119 tak, poniewa\u017c rzeczy podczas wykonywania dzia\u0142aj\u0105 na stosie.<\/p>\n<h4>Kr\u00f3tka dygresja na stosach<\/h4>\n<p>Nie b\u0119d\u0119 wchodzi\u0142 w definicj\u0119 tego terminu w informatyce, ale kod jest wykonywany i dzia\u0142a w taki spos\u00f3b, \u017ce funkcje wyst\u0119puj\u0105 i ca\u0142kiem dos\u0142ownie, w pami\u0119ci komputera, uk\u0142adaj\u0105 si\u0119 jedna na drugiej.<\/p>\n<p>Tak wi\u0119c najnowsza rzecz do uruchomienia zawsze b\u0119dzie znajdowa\u0107 si\u0119 na g\u00f3rze, gdzie korze\u0144 miejsca, w kt\u00f3rym si\u0119 zaczyna, znajduje si\u0119 na dole. Poniewa\u017c piszemy kod we wcze\u015bniej istniej\u0105cej aplikacji, czyli WordPress; wtedy nasz kod prawdopodobnie zawsze b\u0119dzie na g\u00f3rze.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163025-61e74918219d3.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-163025-61e74918219d3.png\" alt=\"Czytanie i zrozumienie dziennik\u00f3w b\u0142\u0119d\u00f3w WordPress, cz\u0119\u015b\u0107 1\"><\/a><\/p>\n<p>Zrozumienie dziennik\u00f3w b\u0142\u0119d\u00f3w WordPress: to nie ten rodzaj stosu<\/p>\n<p>Pomys\u0142 polega na tym, \u017ce kod zacznie by\u0107 wykonywany w WordPressie i b\u0119dzie zmierza\u0142 do pracy, kt\u00f3r\u0105 wykonujemy. Gdy pojawi si\u0119 powiadomienie, ostrze\u017cenie lub b\u0142\u0105d, zwykle b\u0119dzie to co\u015b w naszym kodzie (chocia\u017c WordPress nie jest z tego wyj\u0105tek, generalnie tak jest).<\/p>\n<p>Wi\u0119c kiedy czytasz dziennik b\u0142\u0119d\u00f3w, w istocie czytasz to, co nazywa si\u0119 <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Stack_trace\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u015bladem stosu.<\/a><\/strong> Wikipedia, do kt\u00f3rej prowadzi link, ma do\u015b\u0107 dog\u0142\u0119bn\u0105 definicj\u0119 na ten temat, ale by\u0107 mo\u017ce najbardziej odpowiedni fragment tego postu jest nast\u0119puj\u0105cy:<\/p>\n<blockquote>\n<p>Programi\u015bci cz\u0119sto u\u017cywaj\u0105 \u015bledzenia stosu podczas interaktywnych i po\u015bmiertnych [debugowania] (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Debugging\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/en.wikipedia.org\/wiki\/Debugging<\/a>). U\u017cytkownicy ko\u0144cowi mog\u0105 zobaczy\u0107 \u015blad stosu wy\u015bwietlany jako cz\u0119\u015b\u0107 komunikatu o <a href=\"https:\/\/en.wikipedia.org\/wiki\/Error_message\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">b\u0142\u0119dzie<\/a>, kt\u00f3ry u\u017cytkownik mo\u017ce nast\u0119pnie zg\u0142osi\u0107 programi\u015bcie.<\/p>\n<\/blockquote>\n<p>To zgadza si\u0119 z tym, co opisa\u0142em powy\u017cej, prawda? Ale do\u015b\u0107 m\u00f3wienia o tym, czym jest \u015blad stosu (b\u0119dzie on bardziej przejrzysty, gdy zag\u0142\u0119bimy si\u0119 w debugowanie), wr\u00f3\u0107my do odczytywania pliku dziennika w jego obecnym stanie.<\/p>\n<h3>Powr\u00f3t do czytania dziennika<\/h3>\n<h4>W tym pliki<\/h4>\n<p>Najpierw sp\u00f3jrzmy na doln\u0105 lini\u0119 w sednie powy\u017cej. Zawiera:<\/p>\n<pre><code>[05-Jul-2018 19:44:03 UTC] PHP Warning: include_once(): Failed opening '.\/src\/Admin\/EmailExportSubmenu.php' for inclusion (include_path='.:\/usr\/local\/Cellar\/php\/7.2.5\/share\/php\/pear') in \/Users\/tommcfarlin\/Dropbox\/Projects\/trunk\/wp-content\/plugins\/easy-email-export\/easy-email-export.php on line 25<\/code><\/pre>\n<p>To m\u00f3wi mi, \u017ce w wierszu 25 mojego pliku, <strong>easy-email-export.php,<\/strong> nie uda\u0142o si\u0119 otworzy\u0107 pliku do w\u0142\u0105czenia. Oznacza to, \u017ce mam instrukcj\u0119 <strong>include_once<\/strong> w kodzie, kt\u00f3ra odwo\u0142uje si\u0119 do <strong>.\/src\/Admin\/EmailExportSubmenu.php<\/strong>, kt\u00f3rej nie mo\u017cna znale\u017a\u0107.<\/p>\n<p>Wi\u0119c najlepszym sposobem dzia\u0142ania by\u0142oby znalezienie linii 25 i ustalenie, dlaczego nie znajduje pliku. By\u0107 mo\u017ce to zrzuca pe\u0142n\u0105 \u015bcie\u017ck\u0119, dok\u0105d to patrzy. Dojdziemy do tego za chwil\u0119, m\u00f3wi\u0105c o zapisie do dziennika b\u0142\u0119d\u00f3w.<\/p>\n<h4>Zrozumienie b\u0142\u0119d\u00f3w<\/h4>\n<p>W nast\u0119pnym wierszu (to jest wiersz powy\u017cej tego, kt\u00f3ry w\u0142a\u015bnie przegl\u0105dali\u015bmy) zawiera:<\/p>\n<pre><code>[05-Jul-2018 19:44:03 UTC] PHP Warning: include_once(.\/src\/Admin\/EmailExportSubmenu.php): failed to open stream: No such file or directory in \/Users\/tommcfarlin\/Dropbox\/Projects\/trunk\/wp-content\/plugins\/easy-email-export\/easy-email-export.php on line 25<\/code><\/pre>\n<p>Ta konkretna linia r\u00f3\u017cni si\u0119 tylko nieznacznie, ale daje dodatkowy wgl\u0105d i jest zawarta w klauzuli o tre\u015bci \u201eBrak takiego pliku lub katalogu&quot;. Jest to wnikliwe, poniewa\u017c dos\u0142ownie m\u00f3wi nam, \u017ce plik nie istnieje.<\/p>\n<p>Przynajmniej nie istnieje tam, gdzie patrzy. Wi\u0119c dwie mo\u017cliwo\u015bci to:<\/p>\n<ol>\n<li>nie stworzyli\u015bmy pliku, kt\u00f3rym jeste\u015bmy referencjami,<\/li>\n<li>odwo\u0142ujemy si\u0119 do lokalizacji pliku w niew\u0142a\u015bciwym miejscu<\/li>\n<\/ol>\n<p>Dlatego pierwsz\u0105 rzecz\u0105, kt\u00f3r\u0105 musimy sprawdzi\u0107, jest to, czy plik istnieje w lokalizacji, kt\u00f3r\u0105 pr\u00f3bujemy uwzgl\u0119dni\u0107. Je\u015bli tak si\u0119 nie stanie, powinni\u015bmy utworzy\u0107 plik.<\/p>\n<p>Je\u015bli plik istnieje, wiemy, \u017ce wtyczka pr\u00f3buje za\u0142adowa\u0107 go z niew\u0142a\u015bciwej \u015bcie\u017cki. By\u0107 mo\u017ce b\u0119dziemy musieli spojrze\u0107 na nasz <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/przestrzenie-nazw-i-automatyczne-ladowanie-w-wordpress\/\" title=\"autoloader\">autoloader<\/a><\/strong>, nasz\u0105 \u015bcie\u017ck\u0119 w\u0142\u0105czenia lub spos\u00f3b pobierania plik\u00f3w. Poniewa\u017c szanse s\u0105 takie, \u017ce je\u015bli plik istnieje, to pr\u00f3buje zosta\u0107 za\u0142adowany z miejsca, w kt\u00f3rym nie znajduje si\u0119.<\/p>\n<h3>Niewy\u0142apany b\u0142\u0105d<\/h3>\n<p>W ostatniej linii kodu zobaczysz co\u015b takiego:<\/p>\n<pre><code>[05-Jul-2018 19:43:53 UTC] PHP Fatal error: Uncaught Error: Class 'EasyEmailExportAdminEmailExportSubmenu' not found in \/Users\/tommcfarlin\/Dropbox\/Projects\/trunk\/wp-content\/plugins\/easy-email-export\/easy-email-export.php:37\n#8 \/U in \/Users\/tommcfarlin\/Dropbox\/Projects\/trunk\/wp-content\/plugins\/easy-email-export\/easy-email-export.php on line 37<\/code><\/pre>\n<p>To dobry przyk\u0142ad, po pierwsze, poniewa\u017c wyra\u017anie deklaruje, \u017ce jest to niewy\u0142apany b\u0142\u0105d. Oznacza to, \u017ce niezale\u017cnie od funkcjonalno\u015bci, co\u015b zg\u0142asza b\u0142\u0105d i nie jest wy\u0142apywane.<\/p>\n<ul>\n<li>to mo\u017ce by\u0107 wyj\u0105tek,<\/li>\n<li>mo\u017ce to by\u0107 problem przy pr\u00f3bie wywo\u0142ania funkcji, kt\u00f3ra nie istnieje,<\/li>\n<li>mo\u017ce to dzia\u0142a\u0107 na zmiennej, kt\u00f3ra nie jest zdefiniowana,<\/li>\n<li>i tak dalej.<\/li>\n<\/ul>\n<p>Ostatecznie istnieje mn\u00f3stwo problem\u00f3w, kt\u00f3re mog\u0105 by\u0107 obecne. Dobr\u0105 wiadomo\u015bci\u0105 w tym przyk\u0142adzie jest to, \u017ce jest praktycznie taki sam jak powy\u017cej: nie znaleziono pliku.<\/p>\n<p>Z wyj\u0105tkiem tego, \u017ce zamiast rzuca\u0107 ostrze\u017cenie, PHP jawnie \u015bledzi nas, \u017ce jest to b\u0142\u0105d krytyczny i program nie mo\u017ce kontynuowa\u0107 wykonywania, dop\u00f3ki ten wiersz kodu nie zostanie rozwi\u0105zany. Zanim odrzucimy to jako co\u015b, co jest takie samo jak w poprzedniej sekcji (poniewa\u017c, w pewnym sensie, tak jest), musimy uzna\u0107, \u017ce jest to wyra\u017anie okre\u015blone jako b\u0142\u0105d krytyczny, podczas gdy w poprzednim przyk\u0142adzie by\u0142o to traktowane jako b\u0142\u0105d ostrze\u017cenie.<\/p>\n<p>S\u0105 r\u00f3\u017cne sposoby konceptualizacji tego, ale generalnie my\u015bl\u0119 o tym tak:<\/p>\n<ul>\n<li>Powiadomienie m\u00f3wi mi, \u017ce co\u015b jest nie tak w kodzie, ale nie jest to wystarczaj\u0105co z\u0142e, aby uzasadni\u0107 zatrzymanie wykonania.<\/li>\n<li>Ostrze\u017cenie jest nieco powa\u017cniejsze, poniewa\u017c oznacza, \u017ce \u200b\u200bco\u015b mo\u017ce nie dzia\u0142a\u0107.<\/li>\n<li>B\u0142\u0105d od razu m\u00f3wi \u201eto nie dzia\u0142a i program nie mo\u017ce kontynuowa\u0107&#8221;.<\/li>\n<\/ul>\n<p>Teraz wiemy, \u017ce problem si\u0119 ko\u0144czy, \u017ce tak powiem, i wiemy, na czym polega problem. M\u00f3wi\u0105c najpro\u015bciej, plik, kt\u00f3ry jest wymagany do zako\u0144czenia dzia\u0142ania programu, nie zosta\u0142 znaleziony, a zatem program przestaje dzia\u0142a\u0107.<\/p>\n<p>To z pewno\u015bci\u0105 fatalny b\u0142\u0105d.<\/p>\n<h3>Jakie jest rozwi\u0105zanie?<\/h3>\n<p>To, co przedstawiam jako rozwi\u0105zanie mojego problemu, nie b\u0119dzie nakazem tego, co b\u0119dzie dla ciebie skuteczne. Dla mnie by\u0142a to kwestia wiersza w mojej konfiguracji Composera, tak aby autoloader Composera nie m\u00f3g\u0142 zlokalizowa\u0107 pliku we w\u0142a\u015bciwej lokalizacji (ale ma to wi\u0119cej wsp\u00f3lnego z organizacj\u0105 plik\u00f3w, przestrzeni\u0105 nazw i tak dalej).<\/p>\n<p>Dla ciebie mo\u017ce to by\u0107 co\u015b innego.<\/p>\n<ul>\n<li>mo\u017ce szuka pliku w z\u0142ym katalogu,<\/li>\n<li>mo\u017ce plik ma inn\u0105 nazw\u0119 ni\u017c to, co jest okre\u015blone w kodzie,<\/li>\n<li>a mo\u017ce to co\u015b innego.<\/li>\n<\/ul>\n<p>W ka\u017cdym razie chodzi o to, aby przej\u015b\u0107 przez plik dziennika od do\u0142u do g\u00f3ry, aby zdiagnozowa\u0107 problem i prze\u015bledzi\u0107, co robi PHP, WordPress i twoja praca, a nast\u0119pnie zdiagnozowa\u0107 to stamt\u0105d.<\/p>\n<h2>Zapisywanie do dziennika b\u0142\u0119d\u00f3w<\/h2>\n<p>W nast\u0119pnym po\u015bcie po\u015bwi\u0119cimy chwil\u0119, aby zobaczy\u0107, jak mo\u017cemy pisa\u0107 do dziennika b\u0142\u0119d\u00f3w. Czasami czytanie pliku jest w porz\u0105dku, a po prostu przechodzenie mi\u0119dzy tym, co widzimy, a rozwi\u0105zywaniem problem\u00f3w, jest mi\u0142e.<\/p>\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<p>W nast\u0119pnej cz\u0119\u015bci tej serii po\u015bwi\u0119conej zrozumieniu dziennik\u00f3w b\u0142\u0119d\u00f3w WordPressa zrobimy dok\u0142adnie to.<\/p>\n<h3>Co dalej?<\/h3>\n<p>Nast\u0119pnie przyjrzymy si\u0119, jak u\u017cywa\u0107 niekt\u00f3rych wtyczek opisanych wcze\u015bniej do testowania kodu, a tak\u017ce do profilowania naszego kodu, aby upewni\u0107 si\u0119, \u017ce zrobili\u015bmy wszystko, co w naszej mocy, aby zapewni\u0107 produkcj\u0119 na odpowiednim poziomie.<\/p>\n<p>Nie oznacza to, \u017ce proces debugowania zosta\u0142 ca\u0142kowicie zako\u0144czony, ale zdecydowanie jeste\u015bmy o krok bli\u017cej i jeste\u015bmy w stanie pisa\u0107 kod o takiej jako\u015bci, kt\u00f3ra nie skutkuje powstaniem pliku reprezentuj\u0105cego r\u00f3\u017cne niuanse problem\u00f3w byli\u015bmy zbyt nieostro\u017cni, aby naprawi\u0107 (nie m\u00f3wi\u0105c ju\u017c o zrozumieniu).<\/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>Aby rozpocz\u0105\u0107 debugowanie kodu bez u\u017cycia narz\u0119dzi innych firm, przyjrzyj si\u0119 temu, co generuj\u0105 PHP i WordPress, i spr\u00f3buj zrozumie\u0107 dzienniki b\u0142\u0119d\u00f3w WordPressa.<\/p>\n","protected":false},"author":1,"featured_media":163026,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,845,866],"tags":[1169],"class_list":["post-230104","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230104","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=230104"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230104\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/163026"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230104"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230104"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}