Najslabši dan za razvijalca je, ko se spletno mesto sesuje v produkcijskem okolju in v dnevniku piše »Ups, nekaj je šlo narobe«. Brez sledi sklada, brez konteksta, brez ničesar. To je vodnik o tem, kako pravilno nastaviti obravnavanje napak in odpravljanje napak v PHP – tako da veste, kaj je pokvarjeno, vendar ne razkrivajte svoje varnosti javnosti.
Konfiguracija napak PHP – osnove
Tri ključne nastavitve PHP (v datoteki php.ini ali .user.ini ):
-
display_errors— prikaže napake v brskalniku. VEDNO izklopljeno v produkciji. Razkritje sledi sklada končnemu uporabniku = razkritje varnostnih informacij. -
log_errors— zapisuje napake v dnevniško datoteko. VEDNO Vklopljeno. -
error_log— kjer je (pot do datoteke). -
error_reporting— katere napake sporočiti.E_ALL & ~E_DEPRECATED & ~E_STRICTza produkcijo.
Tipična proizvodna postavitev:
display_errors = Off log_errors = On error_log = /home/USER/logs/php_error.log error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICTLokalni razvoj — Xdebug
Xdebug = razširitev za odpravljanje napak v PHP. Trije glavni načini:
- debug — postopni razhroščevalnik (prekinitvena točka, prestop, pregled spremenljivk). Z IDE (PhpStorm, VS Code) najmočnejše orodje.
- profil — ustvari datoteko cachegrind, preverite, katera funkcija porablja čas. Analizirajte v KCachegrind, Webgrind ali PhpStorm.
- sled — dnevnik vsakega klica funkcije, parametri, vrnitev.
Nastavitev:
pecl install xdebug # u php.ini: zend_extension=xdebug.so xdebug.mode=debug xdebug.start_with_request=trigger xdebug.client_host=host.docker.internal # ako u Docker-uNIKOLI ne zaganjajte Xdebuga v produkciji – 2–5-krat počasnejša zmogljivost, varnostno tveganje.
Ups – prijaznejše strani z napakami
Privzeto sporočilo o napaki PHP je grozno. Ups, to je lepo natisnjena stran z označevanjem sintakse, pregledom skladovnih okvirjev in podatki zahteve.
Laravel ga ima vgrajenega (samo v načinu APP_DEBUG=true). WordPress potrebuje vtičnik (npr. Debug Bar ).
NIKOLI v produkciji — prikaže izvorno kodo in spremenljivke okolja.
Orodja za odpravljanje napak Laravel
Teleskop (uradni)
Spletna nadzorna plošča za vse, kar se dogaja v aplikaciji: zahteve, poizvedbe, opravila, e-poštna sporočila, izjeme, vrata, modeli, ukazi redis, razporejanje zagonov.
composer require laravel/telescope --dev php artisan telescope:install php artisan migrate Dostop do /telescope . Onemogočite v produkciji ali zaščitite z vrati (samo za skrbniške e-poštne naslove).
Vrstica za odpravljanje napak
Lepljiva vrstica na dnu vsake strani s poizvedbami, časi in izjemami.
composer require barryvdh/laravel-debugbar --devSamodejno onemogoči, ko je APP_DEBUG=false.
Ray (Spatie)
Namizna aplikacija + paket Composer. ray($var) v kodi → izpis v namizni aplikaciji Ray v realnem času.
Plus: izpis na drug zaslon, ne moti izhoda. Filtriraj po zahtevi, poizvedbi, modelu.
Cena: 59 $ enkratna pristojbina.
Pail (izvorno za Laravel)
Datoteka dnevnika v živo iz CLI.
php artisan pailFiltriraj po ravni dnevnika, kanalu.
Odpravljanje napak v WordPressu
Konstante WP_DEBUG
V datoteki wp-config.php :
define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); // log u wp-content/debug.log define('WP_DEBUG_DISPLAY', false); // ne pokazuj na ekranu define('SCRIPT_DEBUG', true); // ne minified JS/CSS define('SAVEQUERIES', true); // log svake DB query (memory heavy) V produkciji: WP_DEBUG = false ali WP_DEBUG = true + WP_DEBUG_DISPLAY = false .
Vtičnik za spremljanje poizvedb
Najboljši vtičnik za odpravljanje napak v WP. Prikazuje: poizvedbe v zbirki podatkov, počasne poizvedbe, sprožene kavlje, pogojne oznake, zahteve HTTP, naložene skripte/stile, okolje.
Orodna vrstica v skrbniški vrstici ali na sprednjem delu (samo za skrbnike).
Vrstica za odpravljanje napak + konzola vrstice za odpravljanje napak
Podobno kot Query Monitor, vendar ima tudi živo PHP konzolo.
WP-CLI za odpravljanje napak
wp option get siteurl wp post get 123 wp eval 'var_dump(get_post(123));' wp db query "SELECT * FROM wp_options WHERE option_name LIKE '%cache%'"Poročanje o napakah → centralizirana storitev
Sentry (glej prejšnjo objavo o spremljanju) — vse nezaznane izjeme se samodejno prenesejo v Sentry. Nastavitev Laravela in WP traja 5 minut.
Prilagojeni beležnik v kodi:
// Laravel log()->error('Something broke', ['user' => $user->id, 'order' => $orderId]); // WordPress error_log('My error: ' . print_r($data, true));Odpravljanje napak v proizvodnji brez okvare stvari
Stranka poroča, da je »moja spletna stran čudna« v produkciji. Kaj pa zdaj, brez Xdebuga?
1. Od predvajanja do uprizoritve
Ali imate okolje za pripravo (glejte objavo o pripravah)? Tam omogočite Xdebug, vrstico za odpravljanje napak, nadzornik poizvedb in začnite.
2. Datoteka dnevnika repa v realnem času
tail -f /home/USER/logs/php_error.log tail -f wp-content/debug.log php artisan pailSprožite dejanje v brskalniku in poglejte, kaj piše.
3. Omejite odpravljanje napak na določenega uporabnika/IP
// wp-config.php if ($_SERVER['REMOTE_ADDR'] === 'TVOJ.IP.ADDR.OVDJE') { define('WP_DEBUG', true); define('WP_DEBUG_DISPLAY', true); }Samo tvoj IP vidi napake, drugi ne.
4. Strateška sečnja
Dodaj error_log('CHECKPOINT 1'); , error_log('CHECKPOINT 2: ' . print_r($var, true)); skozi celotno kodo, namesti, spremljaj dnevnik, odstrani, ko ni potreben.
5. Teleskop Laravel omejen na skrbnika
// TelescopeServiceProvider Gate::define('viewTelescope', function ($user) { return in_array($user->email, ['admin@yourdomain.com']); });Varnostne pasti
- display_errors=Vklopljeno v produkciji — prikazuje poverilnice baze podatkov, poti, notranjo strukturo. Velika varnostna puščanja.
- phpinfo() na javnem URL-ju – pogosto pozabimo izbrisati
info.phppo testiranju. Razkrije vse module, poti, konfiguracijo. - Orodna vrstica za odpravljanje napak vidna vsem – Teleskop, orodna vrstica za odpravljanje napak dostopna javnosti. Nastavi vrata.
- Podrobna napaka v odgovoru API-ja – pred pošiljanjem odjemalcu očisti, dnevnik v zaledju je poln.
- Sentry z osebnimi podatki – uporablja kavelj
beforeSendza čiščenje občutljivih podatkov pred pošiljanjem. - Izpostavljena produkcijska datoteka .env – preverite, ali ni dostopna prek URL-ja (blok nginx/Apache za .env).
Praktični potek dela pri odpravljanju napak ...
- Najprej predvajaj lokalno/uprizoritveno.
- Razhroščevalnik korakov Xdebug, če vam je na voljo.
- Teleskop/Monitor poizvedb za vzorce poizvedb in počasnost.
- Sentry za produkcijske napake, drobtinice, uporabniški kontekst.
- Beleži rep v realnem času med uporabniško prijavljenimi napakami.
- Strateški error_log doda-uvesti-slediti-odstraniti za napake samo v produkciji.
- Obdukcija: dokumentiranje vzroka + odprava + preprečevanje.
Odpravljanje napak pri delovanju
- Profilni način Xdebug + KCachegrind za razčlenitev na ravni funkcij.
- Profiler Blackfire , varen za proizvodnjo, občasno vzorči.
- Tideways APM s časovnim pogledom.
- Dnevnik počasnih poizvedb MySQL + RAZLOGA za ozko grlo v zbirki podatkov.
- Spremljalnik poizvedb za poizvedbe WP DB po zahtevi.
Podpora za orožje za množično uničevanje in odpravljanje napak
WMD privzeto nastavi beleženje napak PHP za vsak račun gostovanja – datoteka error_log se samodejno rotira, odjemalec ima dostop prek upravitelja datotek cPanel. Za odjemalce WordPress je Query Monitor nameščen v vzdrževalnem načrtu (samo za skrbnike). Za odjemalce Laravel je vključena namestitev Telescope + Pail, predhodno konfigurirana za dostop samo za skrbnike. Integracija Sentry za kritične napake je vključena v vzdrževalni načrt Pro. Pomagamo pri odpravljanju napak v produkciji – analiza dnevnikov, optimizacija počasnih poizvedb, analiza profilerjev s pomočjo super hitre podpore.
Pogosta vprašanja
Moja napaka display_errors je vklopljena in spletno mesto deluje – v čem je težava? Napadalcu so vidne vse izjeme: poverilnice SQL, poti datotek, okvirji sklada. Takoj zaustavite spletno mesto.
Ali je Xdebug potreben v CI/CD? Samo za poročanje o pokritosti kode (Xdebug ima način pokritosti). Ni potreben za testiranje.
Teleskop nalaga mojo bazo podatkov – kaj pa zdaj? Nastavite php artisan telescope:prune --hours=24 kot cron. Zmanjšajte TELESCOPE_RESPONSE_SIZE_LIMIT .
Ali lahko imam Xdebug in Blackfire hkrati? Tehnično gledano da, vendar ne. V nasprotju sta, izberite enega.
Ray ali dump()? Ray je premium, ne moti izhoda (deluje v ločeni aplikaciji). dump()/dd() sta brezplačna, vendar blokirata odgovor (zahteva za dd kill). Za resno odpravljanje napak se Ray splača.
Potrebujete pomoč pri odpravljanju težav v produkciji? WMD Super hitra podpora vključuje analizo dnevnikov, počasen pregled poizvedb in nastavitev sledenja napakam. Stopite v stik z nami prek kontaktnega obrazca .