Tryb debugowania w Laravelu: APP_DEBUG i cache konfiguracji

Tryb debugowania w Laravelu: APP_DEBUG i cache konfiguracji
Szybka odpowiedź

Tryb debugowania ustawia się przez APP_DEBUG w pliku .env: true lokalnie, false na produkcji, zawsze. Stan faktyczny sprawdzisz komendą php artisan about --only=environment. Jeśli zmiana nie odnosi skutku, konfiguracja siedzi w cache'u: uruchom php artisan config:clear.

Tryb debugowania decyduje o tym, co zobaczy odwiedzający, kiedy aplikacja się wywali: pełny stos wywołań z kodem źródłowym i zmiennymi środowiskowymi albo neutralną stronę błędu. To ustawienie na jedną linijkę, a zarazem jeden z najczęstszych wycieków danych na produkcji.

Artykuł ze ścieżki Programowanie webowe. Sprawdzone na Laravelu 13.30.1 z PHP 8.4.25.

Włączanie i wyłączanie

Ustawienie zmienia się w pliku .env w katalogu głównym projektu i nigdzie indziej:

.env
APP_ENV=local
APP_DEBUG=true

Żeby je wyłączyć, ustaw wartość na false:

.env
APP_ENV=production
APP_DEBUG=false

Stan faktyczny sprawdzisz bez pisania choćby jednej linijki kodu:

bash
php artisan about --only=environment
code
  Environment ........................................................ local
  Debug Mode ...................................................... ENABLED

To jedyna kontrola, która się liczy: pokazuje wartość naprawdę używaną przez aplikację, razem z cache’em.

Pułapka: konfiguracja w cache’u

Ustawiasz APP_DEBUG=false, odświeżasz stronę, a stosy błędów wciąż się wyświetlają. Prawie zawsze winny jest cache konfiguracji.

Po wykonaniu php artisan config:cache Laravel zapisuje wszystkie rozwiązane wartości do bootstrap/cache/config.php i całkowicie przestaje czytać plik .env. Zachowanie zostało zmierzone:

Krok config('app.debug') env('APP_DEBUG')
APP_DEBUG=true, bez cache’u true true
po config:cache, potem zmiana na false w .env true NULL
po config:clear false false

Dwa wnioski. Pierwszy: po każdej zmianie w .env na serwerze z konfiguracją w cache’u trzeba ten cache odbudować.

bash
php artisan config:clear
# albo, na produkcji, od razu odbudować cache
php artisan config:cache
env() zwraca NULL, gdy konfiguracja jest w cache’u

To najsłabiej znana konsekwencja i dotyczy nie tylko debugowania. Wywołanie env('MA_CLE') poza plikiem z katalogu config/ zwróci null, gdy tylko przejdzie config:cache. Reguła jest ostra: env() wyłącznie w config/, wszędzie indziej config('fichier.cle').

Co zawiera config/app.php

Klucz konfiguracyjny tylko odczytuje zmienną środowiskową, z false jako wartością zapasową:

config/app.php
'debug' => (bool) env('APP_DEBUG', false),

Nie zmieniaj tej linijki. Napisano ją tak, żeby domyślne zachowanie było bezpieczne: jeśli APP_DEBUG nie ma w .env, tryb debugowania pozostaje wyłączony. Sprawdzone przez usunięcie zmiennej, config('app.debug') faktycznie zwraca false.

Wpisanie wartości na sztywno w config/app.php ma dwie wady: plik jest wersjonowany, więc ustawienie rozejdzie się po wszystkich środowiskach, a .env zaczyna kłamać.

Akceptowane wartości podlegają regułom konwersji Laravela, zmierzonym wiersz po wierszu:

W pliku .env config('app.debug')
APP_DEBUG=true albo (true), albo 1 true
APP_DEBUG=false albo 0 false
APP_DEBUG=yes true
brak zmiennej false

yes daje true, bo ten ciąg nie jest rozpoznawany jako wartość logiczna i zostaje rzutowany. To dobry powód, żeby trzymać się true i false.

Dlaczego false na produkcji nie podlega dyskusji

Przy APP_DEBUG=true strona błędu pokazuje stos wywołań, fragmenty kodu źródłowego i zawartość załadowanych zmiennych środowiskowych. Odwiedzający, który wywoła błąd, przeczyta więc dane dostępowe do bazy, klucze API i klucz APP_KEY, którym szyfrowane są sesje.

Nie trzeba niczego szukać: wystarczy URL wywołujący wyjątek. Właśnie dlatego aplikacje Laravel bywają przejmowane bez żadnej szczególnej luki w kodzie.

Poprawna konfiguracja serwera produkcyjnego, takiego jak ten postawiony w instalacji Laravela na Debianie, mieści się w trzech linijkach:

.env
APP_ENV=production
APP_DEBUG=false
APP_URL=https://exemple.com

A po wdrożeniu:

bash
php artisan config:cache
php artisan about --only=environment   # kontrola: Debug Mode musi pokazywać OFF

To samo rozumowanie dotyczy publicznych formularzy, które przed otwarciem dla wszystkich trzeba zabezpieczyć przed automatycznymi wysyłkami.

Błędy nadal da się przejrzeć, tyle że w logach, a nie w przeglądarce:

bash
tail -f storage/logs/laravel.log

Tę ścieżkę buduje storage_path(), opisana w ścieżkach aplikacji.

Częste błędy

Cache konfiguracji ignoruje .env Po config:cache Laravel nie czyta już pliku .env. Każda zmiana wymaga config:clear albo odbudowania cache'u.
env() poza katalogiem config/ Gdy konfiguracja jest w cache'u, env() zwraca NULL we wszystkich innych miejscach. Używaj config('fichier.cle').
Zmiana config/app.php zamiast .env Plik jest wersjonowany: ustawienie rozejdzie się po wszystkich środowiskach, a .env zaczyna kłamać.
APP_DEBUG=yes daje true Każdy ciąg nierozpoznany jako wartość logiczna jest rzutowany na true. Trzymaj się true i false.
APP_DEBUG=true na produkcji Strona błędu odsłania stos wywołań, kod źródłowy i zmienne środowiskowe, w tym dane dostępowe do bazy i APP_KEY.

ConfigurationLaravelPHP

Damien Flandrin Web developer od 2010 roku, twórca Gekkode i Email Impact. Każdy artykuł jest sprawdzany na prawdziwym projekcie przed publikacją. Kontakt
Newsletter

Nowe testy, poradniki i projekty, e-mailem.

Powtarzalne testy, wersjonowany kod, datowane wyniki. Nigdy spamu.