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

可能な限り確実にmkdirを成功させるには / Make mkdir

可能な限り確実にmkdirを成功させるには / Make mkdir

PHPerKaigi 2023 のLTの資料です

Yuichi Sugiyama
PRO

March 25, 2023
Tweet

More Decks by Yuichi Sugiyama

Other Decks in Technology

Transcript

  1. ՄೳͳݶΓ࣮֬ʹ

    mkdirΛ੒ޭͤ͞Δʹ͸
    PHPerKaigi 2023


    ͗͢΍·@MASHݭָஂ

    View Slide

  2. Whoami
    • ਿࢁ ༞Ұ @oogFranz


    • αΠϘ΢ζͰେاۀ޲͚άϧʔϓ΢ΣΞ

    Garoon (Ψϧʔϯ) ࡞ͬͯΔ


    • ෳۀϛϡʔδγϟϯ


    • MASHݭָஂɺFried Banana CabinɺϒϧʔάϥεˑϙϦε

    View Slide

  3. σΟϨΫτϦΛPHP͔Β࡞Ε·͔͢ʁ
    function makeDirectory(string $path): bool
    {
    //???
    }

    View Slide

  4. mkdir() Ͱ༨༟ͩͥʂ
    function makeDirectory(string $path): bool
    {
    return mkdir($path);
    }

    View Slide

  5. mkdir() Ͱ༨༟ͩͥʂ
    ͜ͷ࣮૷ͷ໰୊఺Λग़དྷΔݶΓ্͛ͯΈ·͠ΐ͏ʂ
    function makeDirectory(string $path): bool
    {
    return mkdir($path);
    }

    View Slide

  6. σΟϨΫτϦύεΛࢦఆ͢ΔͱWarning
    makeDirectory('test/foo/bar');
    //Warning: mkdir(): No such file or directory in /usr/
    local/code/mkdir.php on line 9
    • testσΟϨΫτϦɺfoo σΟϨΫτϦ͕ଘࡏ͠ͳ͍৔߹

    Warning͕ൃੜ͢Δ


    • σΟϨΫτϦ͸࡞੒͞Εͳ͍

    View Slide

  7. ϚχϡΞϧΛͪΌΜͱಡΉ
    • recursiveΦϓγϣϯ͸mkdir ͷ —parents, -p Φϓγϣϯͱಉ͡


    • ਌σΟϨΫτϦΛඞཁʹԠͯ͡࡞੒ͯ͘͠ΕΔ
    mkdir(
    string $directory,
    int $permissions = 0777,
    bool $recursive = false,
    ?resource $context = null
    ): bool

    View Slide

  8. recursive = trueΛ࢖͏
    function makeDirectory(string $path): bool
    {
    return mkdir($path, recursive: true);
    }

    View Slide

  9. σΟϨΫτϦ͕طʹଘࡏ͢ΔͱWarning
    • ࡞੒લʹis_dir(),
    fi
    le_exists()ͰνΣοΫ͕ඞཁ


    • ͜Ε΋ϚχϡΞϧʹॻ͍ͯ͋Δ
    makeDirectory('foo');
    makeDirectory('foo');
    // Warning: mkdir(): File exists in /usr/local/
    code/mkdir.php on line 9

    View Slide

  10. is_dir,
    fi
    le_existsΛ࢖͏
    function makeDirectory(string $path): bool
    {
    if (is_dir($path)) {
    return true;
    }
    if (file_exists($path)) {
    return false;
    }
    return mkdir($path, recursive: true);
    }

    fi
    le_exists() ͕ trueͷͱ͖͸݁ՌతʹσΟϨΫτϦ͕࡞੒Ͱ͖ͳ͍ͷͰ஫ҙ

    View Slide

  11. σΟϨΫτϦ͕ͳ͍ͷʹis_dir͕trueΛฦ͢
    makeDirectory('foo/bar');
    makeDirectory('foo/bar');
    sleep(10); //͜͜Ͱผϓϩηε͔Βfoo/barσΟϨΫτϦΛ࡟আ͢Δ


    makeDirectory('foo/bar');

    View Slide

  12. σΟϨΫτϦ͕ͳ͍ͷʹis_dir͕trueΛฦ͢
    makeDirectory('foo/bar');
    makeDirectory('foo/bar');
    sleep(10); //͜͜Ͱผϓϩηε͔Βfoo/barσΟϨΫτϦΛ࡟আ͢Δ


    makeDirectory('foo/bar');
    σΟϨΫτϦ͕࡞੒͞Εͳ͍ʂ

    View Slide

  13. is_dir()͸Ωϟογϡ͞Ε͍ͯΔʂ
    • is_dir()ͳͲͷ݁Ռ͸ύϑΥʔϚϯεͷͨΊʹΩϟογϡ͞ΕΔ


    • Ωϟογϡ͸ϓϩηε͝ͱʹ࡞੒͞ΕΔɻ


    • ଞͷϓϩηεʹΑͬͯϑΝΠϧͷεςʔλε͕มΘΔ৔߹͸
    ΩϟογϡͷΫϦΞ͕ඞཁ

    View Slide

  14. clearstatcache()Λ࢖͏
    function makeDirectory(string $path): bool
    {
    clearstatcache();
    if (is_dir($path)) {
    return true;
    }
    if (file_exists($path)) {
    return false;
    }
    return mkdir($path, recursive: true);
    }

    View Slide

  15. clearstatcache()Λ࢖͏
    function makeDirectory(string $path): bool
    {
    clearstatcache();
    if (is_dir($path)) {
    return true;
    }
    if (file_exists($path)) {
    return false;
    }
    return mkdir($path, recursive: true);
    }
    JT@EJS͕ਖ਼͘͠ಈ࡞͢Δ

    View Slide

  16. ࣮ߦλΠϛϯάʹΑͬͯWarning
    is_dir()
    is_dir()
    fi
    le_exits()
    fi
    le_exits()
    ϓϩηε1
    ϓϩηε2
    ·ͩσΟϨΫτϦ͕

    ଘࡏ͠ͳ͍ͷͰGBMTF

    View Slide

  17. ࣮ߦλΠϛϯάʹΑͬͯWarning
    is_dir()
    is_dir()
    fi
    le_exits()
    fi
    le_exits()
    mkdir()
    ϓϩηε1
    ϓϩηε2
    σΟϨΫτϦ࡞੒੒ޭ

    View Slide

  18. ࣮ߦλΠϛϯάʹΑͬͯWarning
    is_dir()
    is_dir()
    fi
    le_exits()
    fi
    le_exits()
    mkdir()
    mkdir()
    ϓϩηε1
    ϓϩηε2
    σΟϨΫτϦ࡞੒ࣦഊʂ

    View Slide

  19. Τϥʔͷ཈͑ํ
    • Τϥʔ੍ޚԋࢉࢠ `@` Λ࢖͏

    खܰɻͳΜ͔ෛ͚ͨؾ͕͢Δɻ


    • error_reporting Ͱ E_WARNINGΛ཈͑Δ

    ଞͷE_WARNING΋཈͑ͯ͠·͏ͷͰ͓קΊ͠ͳ͍


    • set_error_handler ͰWarningΛΩϟον͢Δ

    ਅ໘໨ʹ΍ΔͳΒ͜Εɻ


    • ഉଞ੍ޚʁʁ

    ΦʔόʔΩϧͰ͸ʁ͜ͷϝιουҎ֎͔Βͷݺͼग़͠ʹ͸উͯͳ͍ɺɺɺ

    View Slide

  20. Τϥʔ੍ޚԋࢉࢠΛ࢖ͬͨ৔߹
    function makeDirectory(string $path): bool
    {
    if (@mkdir($path, recursive: true) === false) {
    clearstatcache();
    return is_dir($path);
    }
    return true;
    }
    • Τϥʔ੍ޚʹ೚ͤͯࣄલͷσΟϨΫτϦνΣοΫ͸ෆཁʢ͔΋ʣ

    View Slide

  21. Permission
    • ͦ΋ͦ΋࡞੒ݖݶ͕ͳ͍৔߹΋E_WARNING͕ൃੜ


    • is_writableͰ֬ೝ͸Մೳ


    • ਌σΟϨΫτϦ͕͋Δͱ͖ɺͳ͍ͱ͖͕͋ΔͷͰ࠶ؼ͕ඞཁ


    • ΋͏࣮ߦ࣮ͯ͠ߦͰ͖Δ͔ࢼͨ͠ํ͕ૣ͘ͳ͍ʁʁ

    →Τϥʔ੍ޚ͸ඞਢ

    View Slide

  22. ·ͱΊ
    • mkdirͳͲϑΝΠϧγεςϜʹ৮Δ৔߹͸ߟྀϙΠϯτ͸ଟ͍


    • ϚχϡΞϧ͸ͪΌΜͱಡ΋͏


    • ϑΝΠϧγεςϜͷΩϟογϡ͸ϋϚΔͱͭΒ͍ͷͰɺ

    clearstatcacheΛ࢖͍·͠ΐ͏


    • ύʔϛογϣϯΉ͔͍ͣ͠


    • Ͳ͏ؤுͬͯ΋Warning͸ಀΕΒΕͳ͍ͷͰɺ

    Τϥʔ੍ޚ͕Μ͹Γ·͠ΐ͏

    View Slide

  23. αΠϘ΢ζPHPerKaigi ޙ೔ஊΠϕϯτʂ
    https://cybozu.connpass.com/event/277790/
    4/5ʢਫʣ 19:00~ @αΠϘ΢ζ೔ຊڮΦϑΟε

    View Slide