$30 off During Our Annual Pro Sale. View Details »

PHPの様々なエラー

uzulla
March 16, 2019

 PHPの様々なエラー

2019/03/17 at hachioji.pm #75 LT

uzulla

March 16, 2019
Tweet

More Decks by uzulla

Other Decks in Programming

Transcript

  1. PHPͷ༷ʑͳΤϥʔ
    hachiojipm #75
    2019/03/16
    @uzulla

    View Slide

  2. લఏ
    » ඞͣ͠·͠ΐ͏ɻ
    error_reporting(E_ALL);

    View Slide

  3. PHPͷΤϥʔ
    » ࣗ༝ͳՕॴͰͷΩϟον͸͔ͳΓࠔ೉͕ͩɺϋϯυϥΛઃఆͰ͖Δ
    » PHP 7ʹͳΓɺେମ͕ʮErrorʯͱ͍͏Exceptionʹͳͬͨ
    » Ωϟον͠ͳ͍ͱ(ຊ෺ͷ)Errorʹม׵͞ΕΔ
    » ʢঘɺྫ֎Ωϟον͠ͳ͚Ε͹͍ͣΕʹͤΑࢮ͵ʣ
    » શ෦͕ྫ֎Ͱ͸ͳ͍͕ɺେମThrowableΛΩϟον͢Ε͹Α͍
    » ͔͠͠Թނ஌৽ɺൿ఻ͷλϨΛ͔͖ճͧ͢ɻ

    View Slide

  4. Τϥʔͷେ·͔ͳ෼ྨʢཁग़యʣ
    » ໰౴ແ༻Ͱࢮ͵΍ͭ
    » Fatal Errors
    » Parse Error
    » ࢮ͵͚Ͳख౰͢Ε͹ࢮͳͳ͍΍ͭ
    » Recoverable Fatal Error
    » ख౰͠ͳͯ͘΋ࢮͳͳ͍΍ͭ
    » Warning
    » Noticeʢ౳

    View Slide

  5. recoverable ͱ͸…
    » Τϥʔʢྫ֎Έ͍ͨͳͷʣΛΩϟονͯ͠ѲΓͭͿͤ͹ࢮͳͳ͍
    » ޙड़

    View Slide

  6. ෼ྨΛ͞Βʹࡉ໨ʹ

    View Slide

  7. Fatal, Parse(Syntax) Error
    » E_ERROR
    » E_CORE_ERROR
    » E_COMPILE_ERROR
    » E_USER_ERROR
    » E_PARSE

    View Slide

  8. Recoverable Fatal Error
    » E_RECOVERABLE_ERROR

    View Slide

  9. Warning
    » E_WARNING
    » E_CORE_WARNING
    » E_COMPILE_WARNING
    » E_USER_WARNING

    View Slide

  10. Notice ͳͲ
    » E_DEPRECATED
    » E_USER_DEPRECATED
    » E_NOTICE
    » E_USER_NOTICE
    » (E_STRICT)

    View Slide

  11. E_ERROR (1<<0L) 1
    E_WARNING (1<<1L) 2
    E_PARSE (1<<2L) 4
    E_NOTICE (1<<3L) 8
    E_CORE_ERROR (1<<4L) 16
    E_CORE_WARNING (1<<5L) 32
    E_COMPILE_ERROR (1<<6L) 64
    E_COMPILE_WARNING (1<<7L) 128
    E_USER_ERROR (1<<8L) 256
    E_USER_WARNING (1<<9L) 512
    E_USER_NOTICE (1<<10L) 1024
    E_STRICT (1<<11L) 2048
    E_RECOVERABLE_ERROR (1<<12L) 4096
    E_DEPRECATED (1<<13L) 8192
    E_USER_DEPRECATED (1<<14L) 16384

    View Slide

  12. Ͱ͸Ҿ͖ى͜͠·͠ΐ͏

    View Slide

  13. E_ERROR
    » DateTimeInterfaceΛΠϯϓϦ͠Α͏ͱ͢ΔͳͲ
    class b implements DateTimeInterface {
    }
    new b();

    View Slide

  14. ଈࢮ͢ΔͷͰ
    » ʢޙड़ͷʣset_error_hander΋ݺ͹Εͳ͍
    » ͳʹ΋Ͱ͖ͳ͍ɺඞͣࢮ͵
    » ͔͠͠ɺΤϥʔͷ؃औΓ͘Β͍͸Ͱ͖Δ

    View Slide

  15. ஌Δʹ͸
    register_shutdown_function(function () {
    $error = error_get_last();
    if ( !is_array($error) ||
    !( $error['type'] &
    (E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR |
    E_PARSE | E_USER_ERROR)
    )
    ) { return; // set_error_handelerͰर͍͑ͯΔ͸ͣͳͷͰແࢹ }
    // र͑ͳ͔ͬͨFATALͳΤϥʔ
    echo "{$error['type']}:{$error['message']}".
    " in {$error['file']}:{$error['line']}";
    });

    View Slide

  16. ۩ମྫ
    register_shutdown_function(function () {
    $error = error_get_last();
    if ( !is_array($error) ||
    !( $error['type'] &
    (E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR |
    E_PARSE | E_USER_ERROR)
    )
    ) { return; }
    error_log("Fatal Error:{$error['type']}:{$error['message']}".
    " in {$error['file']}:{$error['line']}");
    });
    class b implements DateTimeInterface {}
    new b();

    View Slide

  17. » Կ౓΋ݴ͏͚Ͳɺٹ͑ΔΘ͚Ͱ͸ͳ͍
    » ۤ೑ͷϩάͨ͠ΓɺΤϥʔը໘Λग़ͨ͠Γఔ౓
    » ૹ৴ͨ͠σʔλ͕΋ͲΔΘ͚Ͱ͸ͳ͍ͷͰɺΰϛͷͳ͍ΩϨΠͳΤ
    ϥʔը໘Λग़ͨ͢Ίʹ͸ग़ྗͳͲΛOutput bufferingͯ͠ૹ৴͠ͳ
    ͍Ͱ͓͘͜ͱ
    » https://uzulla.hateblo.jp/entry/2019/03/13/200820
    » ͋·Γڽͬͨࣄ͸͠ͳ͍΄͏͕ແ೉ʢ͢Ͱʹ͓͔͍͠ঢ়ଶ͔ͩΒ
    Ͷʂʣ

    View Slide

  18. E_CORE_ERROR
    » vmपΓͷΤϥʔ…ൃੜͤ͞Δํ๏͕Θ͔ΒΜ
    » odbcʹ͋Γͦ͏ʢ͔͠͠odbcΛ࢖͏ࣄͳͲ͋Δͷ͔…ʁ
    » (ྑ͍αϯϓϧίʔυͭ͘Εͳ͔ͬͨ!)

    View Slide

  19. E_COMPILE_ERROR
    » ఆٛࡁΈͷΫϥεΛએݴ͢Ε͹Α͍
    class DateTime{}

    View Slide

  20. E_USER_ERROR
    » ࣗ෼Ͱ౤͛ΒΕΔ
    » trigger_error
    trigger_error("test error", E_USER_ERROR);

    View Slide

  21. E_PARSE
    » จ๏ؒҧ͑ΔͳͲ
    » ࢮ͵͠ɺ࠷ॳͷϑΝΠϧͩͱregister_shutdown_function΋ݺ͹Εͳ͍
    require("bad.php"); // register_shutdown_functionݺ͹ΕΔ
    ...
    if if (1){} // ͳʹ΋Ͱ͖ͣଈࢮ

    View Slide

  22. ஫ҙɺEvalʹ͍ͭͯ
    » eval΋E_PARSE͕ൃੜ͢Δͷ͕ͩɺྫ֎ͷΩϟονΛ͠ͳ͍৔߹ͷΈੜ·ΕΔ
    » ͳ͓ɺྫ֎ΛΩϟον͠ͳ͍ͱFatal Errorѻ͍ʹͳΓɺࢮ͵ɻ
    » PHPϜζΧγΠωʔ
    // ࢮͳͳ͍ʢ͠ɺѲΓ௵ͤ͹Τϥʔ΋ͳ͍ʣ
    try{ eval("if if(1){};"); }catch(\Throwable $e){ }
    // Uncaught ExceptionͰ਌͝ͱࢮ͵
    eval("if if(1){};");

    View Slide

  23. E_RECOVERABLE_ERROR
    » ΦϒδΣΫτΛແ஡ͳΩϟετ͢ΔͳͲͯ͠ൃੜͰ͖Δ
    » ࢮ͵…͕ɺ෮׆Ͱ͖Δ
    echo function() {};

    View Slide

  24. ͨͱ͑͹͜ΕΛೖΕΔͱɺऴྃ͠ͳ͍
    » NoticeؚΊɺ͋ΒΏΔΤϥʔʢFatalআ͘ʣ͕ඈͼࠐΉ
    » Notice΋͘ΔͷͰɺ͜͜ͰExit͢ΔͱNotice΋ڐ͞ͳ͍ࣄ͕Ͱ͖Δ
    ʢ෭࡞༻తϝϦοτʢओ؍ʣʣ
    set_error_handler(function ($type, $message, $file, $line) {
    error_log("Error: {$type}:{$message} in {$file}:{$line}");
    // ͜͜Ͱ exit͠ͳ͍ͱɺ໭࣮ͬͯߦ͕ଓ͘
    // ྫ֎ͷѲΓͭͿ͠ͷΑ͏ͳ΋ͷ
    });

    View Slide

  25. E_WARNING
    » ͢ͰʹϘσΟ͕ૹ৴։࢝͞Ε͍ͯΔͷʹɺϔομʔΛ͓͘Ζ͏ͱͨ͠
    ࣌ͳͲ
    » ࢮͳͳ͍ɺͷ͕ࠔΔɻʢͷͰɺલड़ͷςΫΛ࢖͏ͱΑ͍ࣄ΋ʣ
    header("X-MY-HEADER: hoge");
    echo "hoge";
    session_start();

    View Slide

  26. E_CORE_WARNING
    » ଘࡏ͠ͳ͍֦ுΛphp.iniͰࢦఆ͢Δ ౳
    » ΍͸Γαϯϓϧίʔυ͕͍͍ײ͡ͷ͕ͳ͔ͬͨͷͰলུ

    View Slide

  27. E_COMPILE_WARNING
    » /*Λด͡ͳ͍ͳͲ
    » ιʔείʔυͷจࣈίʔυΛ͓͔͘͢͠ΔͳͲ
    » ͜ΕɺWarnͱ͍͏͔Syntax ErrorͰ͸ͳ͍ͷ͔ͱ…
    /*

    View Slide

  28. E_USER_WARNING
    » ࣗ෼Ͱtrigger͢Δ
    trigger_error("test error", E_USER_WARNING);

    View Slide

  29. E_DEPRECATED
    » ඇਪ঑ͷؔ਺ʢ΍ڍಈʣΛͤ͞Δ
    » error_reporting(E_ALL)ͯ͠ͳ͍ͱͰͳ͍
    error_reporting(E_ALL);
    define("SomeThing", "is", true);

    View Slide

  30. E_USER_DEPRECATED
    » ࣗ෼Ͱ౤͛Δ
    » error_reporting(E_ALL)ͯ͠ͳ͍ͱͰͳ͍
    trigger_error("test error", E_USER_DEPRECATED);

    View Slide

  31. E_NOTICE
    » ະఆٛม਺ʹ৮Δɺଘࡏ͠ͳ͍ൣғͷ഑ྻʹ৮Δ
    » error_reporting(E_ALL)ͯ͠ͳ͍ͱͰͳ͍
    echo $undefined;

    View Slide

  32. E_USER_NOTICE
    » ࣗ෼Ͱ౤͛Δ
    » error_reporting(E_ALL)ͯ͠ͳ͍ͱͰͳ͍
    trigger_error("test error", E_USER_DEPRECATED);

    View Slide

  33. (E_STRICT)
    » PHP5·Ͱ͔͠ͳ͍ɺ7Ͱ͸ͳ͘ͳͬͨ(ଞʹҠಈ͞Εͨ)
    » ܧঝͨ͠ΫϥεϝιουͷϑΟϯΨʔϓϦϯτ͕ҧ͏ͱ͔ʢҾ਺͕ม
    ΘΔͱ͔ʣ

    View Slide

  34. ·ͱΊ
    » Ή͔͍ͣ͠
    » ൿ఻ͷλϨ͕෗Δʢόʔδϣϯ্͕͕Δͱඍົʹʣ
    » ωοτʹ͸ʢࣗ෼ΛؚΊͯʣӕ͕ଟ͍ͷͰɺݕূͨ͠Γɺͨ·ʹλϨ
    Λ͔͖·ͥͳ͍ͱ͍͚ͳ͍ʢࠓ೔͔͖ࠞͥͨΒؒҧͬͯͨ…ʣ
    » ϏοτͷฒͼΛͳ͕Ί͍ͯΔͱɺ૿ઃͷྺ࢙Λײ͡ΒΕΔ
    » ·͋PHPͳͷͰͶʂ

    View Slide

  35. ༨ஊ@ʹ͍ͭͯ
    » @Λ͚ͭͨࣜͷΤϥʔΛʮग़ྗ͠ͳ͍ʯʢ͚ͩʣ
    // $aม਺͕ແ͍࣌
    php > echo @$a; // ΤϥʔͰͳ͍ɺNULLʹͳΔ
    php > echo $a;
    PHP Notice: Undefined variable: a in php shell code on line 1

    View Slide

  36. » @ͳΒFatalͰࢮͳͳ͍Θ͚Ͱ΋ͳ͘ʢࠂ஌ͳ͘ࢮ͵͕ʣ
    » @͸ݟ͚ͭͨΒʢཧ༝͕ͳ͚Ε͹ʣফ͠·͠ΐ͏
    // ݹ୅ɺ͜͏͍͏ॻ͖ํ΋͋ͬͨͳ
    $id = @$_POST['id'];
    // ͍·ͳΒ͜͏͔
    $id = $_POST['id'] ?? null;
    » ͳ͓ɺࣗલͰset_error_handlerͨ͠Βແࢹ͞Εͳ͍ͷͰɺ@׆༻͢
    Δݹ͍ϥΠϒϥϦΛ࢖͏࣌͸஫ҙʂ

    View Slide