0Pricing
PHP Academy · Lekcja

Rejestrowanie błędów i dobre praktyki

Rejestruj błędy w plikach i stosuj wzorce obsługi błędów odpowiednie dla środowiska produkcyjnego

Rejestrowanie błędów i dobre praktyki to bezpłatna lekcja PHP Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej PHP Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs PHP Academy zawiera 4 lekcji w sumie.

Dlaczego rejestrowanie błędów ma znaczenie

W środowisku produkcyjnym nie można wyświetlać błędów użytkownikom, ale nadal trzeba wiedzieć, kiedy coś pójdzie nie tak. Rejestrowanie zapisuje szczegóły błędów w plikach lub usługach, dzięki czemu można je później przeanalizować.

error_log()

Najprostsza funkcja rejestrowania — zapisuje komunikat w dzienniku błędów PHP:

<?php
error_log('User login failed for: ' . $email);
error_log('DB query took: ' . $duration . 'ms');

// Send to email (not recommended for high traffic)
error_log('Critical: server out of memory', 1, 'admin@example.com');

Rejestrowanie strukturalne

Rejestruj dane strukturalne w formacie JSON, aby ułatwić ich analizowanie i przeszukiwanie:

<?php
function logEvent(string $level, string $message, array $context = []): void {
    $entry = array_merge([
        'ts'      => date('c'),
        'level'   => $level,
        'message' => $message,
    ], $context);

    error_log(json_encode($entry));
}

logEvent('ERROR', 'Payment failed', [
    'order_id' => 123,
    'amount'   => 99.99,
    'user_id'  => 45,
]);

Poziomy rejestrowania (PSR-3)

Standard PSR-3 definiuje poziomy rejestrowania:

  • emergency — system nie działa
  • alert — należy natychmiast podjąć działanie
  • critical — stan krytyczny
  • error — błędy czasu wykonywania
  • warning — nietypowe zdarzenia, które nie są błędami
  • notice — normalne, ale istotne zdarzenia
  • info — komunikaty informacyjne
  • debug — szczegółowe informacje debugowania

Rejestrator Monolog

Monolog to standardowa biblioteka PHP do rejestrowania, zgodna z PSR-3:

<?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$log = new Logger('app');
$log->pushHandler(new StreamHandler('/var/log/app.log', Logger::DEBUG));

$log->info('User logged in', ['user_id' => 42]);
$log->error('Payment failed', ['order' => 99, 'reason' => 'card_declined']);
$log->warning('Slow query', ['duration_ms' => 3200]);

Obsługa wyjątków w środowisku produkcyjnym

Moduł obsługi wyjątków gotowy do użycia w środowisku produkcyjnym, który rejestruje błędy i zwraca bezpieczną odpowiedź:

<?php
set_exception_handler(function(\Throwable $e) {
    $id = uniqid('err_');
    error_log(json_encode([
        'error_id' => $id,
        'class'    => get_class($e),
        'message'  => $e->getMessage(),
        'file'     => $e->getFile(),
        'line'     => $e->getLine(),
        'trace'    => $e->getTraceAsString(),
    ]));
    http_response_code(500);
    echo json_encode(['error' => 'Server error', 'id' => $id]);
    exit(1);
});

Rotacja dzienników

Pliki dzienników rosną bez ograniczeń — rotuj je za pomocą logrotate w systemie Linux lub opartych na czasie modułów obsługi w Monolog:

<?php
use Monolog\Handler\RotatingFileHandler;

$handler = new RotatingFileHandler(
    '/var/log/app.log',
    30,              // keep 30 days
    Logger::DEBUG
);

// Creates dated files: app-2024-05-27.log
$log = new Logger('app');
$log->pushHandler($handler);

Rejestrowanie z pełnym kontekstem

Dodawaj kontekst żądania do każdego wpisu w dzienniku, aby ułatwić debugowanie:

<?php
function getRequestContext(): array {
    return [
        'url'     => $_SERVER['REQUEST_URI'] ?? '',
        'method'  => $_SERVER['REQUEST_METHOD'] ?? '',
        'ip'      => $_SERVER['REMOTE_ADDR'] ?? '',
        'user_id' => $_SESSION['user_id'] ?? null,
    ];
}

// Add to every log call:
$log->error('Order failed', array_merge(
    getRequestContext(),
    ['order_id' => $orderId]
));

Unikanie danych wrażliwych w dziennikach

Nigdy nie rejestruj informacji wrażliwych:

  • Haseł i tokenów
  • Numerów kart kredytowych
  • Danych osobowych (zgodność z RODO)
  • Pełnych śladów stosu wyjątków w odpowiedziach wyświetlanych użytkownikom
<?php
// Bad:
error_log('Login attempt: ' . $email . ' / ' . $password);

// Good:
error_log('Login failed for user: ' . substr($email, 0, 3) . '***');

Sentry i zewnętrzne śledzenie błędów

W środowisku produkcyjnym korzystaj z usług śledzenia błędów, takich jak Sentry, aby centralizować informacje o błędach i otrzymywać o nich alerty:

<?php
// After composer require sentry/sdk
\Sentry\init(['dsn' => getenv('SENTRY_DSN')]);

// Automatic capture of unhandled exceptions
// Manual capture:
try {
    processOrder();
} catch (\Throwable $e) {
    \Sentry\captureException($e);
    throw $e;
}

Warunki wstępne oparte na asercjach

Używaj asercji do wykrywania błędów programistycznych podczas tworzenia aplikacji:

<?php
// assert() throws AssertionError when false (dev mode)
assert(is_int($userId), 'userId must be an integer');
assert($amount > 0, 'amount must be positive');

// Or throw explicitly:
if (!is_int($userId)) {
    throw new \InvalidArgumentException('userId must be int');
}

Szybki test

Który poziom rejestrowania według PSR-3 wskazuje sytuację wymagającą natychmiastowej uwagi?

Podsumowanie: rejestrowanie błędów

Dobre praktyki rejestrowania:

  • Stosuj strukturalne rejestrowanie w formacie JSON z datą i godziną, poziomem, komunikatem i kontekstem
  • Przestrzegaj poziomów rejestrowania PSR-3
  • W aplikacjach produkcyjnych używaj Monolog
  • Rotuj dzienniki, aby zapobiec zapełnieniu dysku
  • Nigdy nie rejestruj haseł ani danych wrażliwych
  • Korzystaj z Sentry lub podobnego narzędzia do śledzenia błędów w czasie rzeczywistym

Często zadawane pytania

Czy lekcja „Rejestrowanie błędów i dobre praktyki” jest bezpłatna?

Tak — pełny tekst „Rejestrowanie błędów i dobre praktyki” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu PHP Academy, przejdź na CoddyKit PRO. Kurs PHP Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Rejestrowanie błędów i dobre praktyki”?

Rejestruj błędy w plikach i stosuj wzorce obsługi błędów odpowiednie dla środowiska produkcyjnego Ćwiczysz PHP Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć PHP Academy?

Nie wymagamy żadnego doświadczenia. PHP Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Rejestrowanie błędów i dobre praktyki”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji PHP Academy?

Tak. Każda lekcja PHP Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Typy błędów PHP i raportowanie
  2. Try, catch i finally
  3. Tworzenie własnych wyjątków
  4. Rejestrowanie błędów i dobre praktyki
← Powrót do PHP Academy