Fatal error

booom

Andrzej 'nAndy' Łukaszewski, Wikia Inc.
AKAI, 8 maja, 2012

Kim jestem?

Plan prezentacji

  1. Wprowadzenie
  2. Dlaczego powinniśmy interesować się błędami?
  3. Typy błędów
  4. Obsługa błędów
  5. Co jeszcze można zrobić?
Sir Maurice Wilkes

Dlaczego powinniśmy interesować się błędami?

Błędy w naszych programach są czymś nie pożądanym ze względu na:

Typy błędów w PHP

Podręcznik PHP

  • Błędy parsera/składniowe E_PARSER
    PHP Parse error: syntax error, unexpected '=' in test.php on line 2
  • Notices E_NOTICE
    PHP Notice: Undefined offset: 0 in test.php on line 4
  • Ostrzeżenia (warnings) E_WARNING
    PHP Warning: Invalid argument supplied for foreach() in test.php
    on line 3
  • Błędy krytyczne (fatal errors) E_ERROR
    PHP Fatal error: Call to undefined function nothing() in test.php on line 3
  • Wyjątki (exceptions)
    PHP Fatal error: Uncaught exception 'Exception' 
    with message 'an exception' in test.php:3

Życie

oh, really?

Obsługa błędów w PHP

php.ini

Funkcje

Przykład użycia

error_reporting = -1
display_errors = "0"
log_errors = "1"
error_log = '/var/www/log/php'
MediaWiki Wikia Error

Przykład użycia

Bootstrap.php

public function __construct($application) {
    parent::__construct($application);
    MyApp_Error_Handler::set();
}

library/MyApp/Error/Handler.php

class MyApp_Error_Handler {
    public static function handle($errno, $errstr, $errfile, $errline) {
        if (!error_reporting()) return;
        throw new Exception($errstr . " in $errfile:$errline". $errno);
    }
    public static function set() {
        set_error_handler(array(__CLASS__, 'handle'));
    }
}

Przykład użycia

Przykład użycia

Co jeszcze można zrobić?

Monitoring

Podział środowisk cz.1

Podział środowisk: Slim framework

$_ENV['SLIM_MODE'] = 'production';
$app = new Slim(array(
    'mode' => 'production'
));
$app->configureMode('production', function () use ($app) {
    $app->config(array(
        'log.enable' => true,
        'log.path' => '../logs',
        'debug' => false
    ));
});
$app->configureMode('development', function () use ($app) {
    $app->config(array(
        'log.enable' => false,
        'debug' => true
    ));
});

Podział środowisk: Symfony, Zend frameworks

Testy jednostkowe

Even good programmers make mistakes. The difference between a good programmer and a bad programmer is that the good programmer uses tests to detect his mistakes as soon as possible. phpunit.de

Code review

wtf per minute
nuclear win

Dziękuję za uwagę! (przydatne linki)

Debugging Production Systems by Bryan Cantrill:
http://www.infoq.com/presentations/Debugging-Production-Systems

Podręcznik PHP:
http://www.php.net/manual/pl/

Podręcznik PHPUnit:
http://www.phpunit.de/manual/current/en/index.html

Prezentacja:
http://slides.wikia.net/akai/20120508/phpFatalError/

The End

buuuum