PHPerKaigi 2023 のLTの資料です
ՄೳͳݶΓ࣮֬ʹ mkdirΛޭͤ͞ΔʹPHPerKaigi 2023͗͢·@MASHݭָஂ
View Slide
Whoami• ਿࢁ ༞Ұ @oogFranz• αΠϘζͰେاۀ͚άϧʔϓΣΞ Garoon (Ψϧʔϯ) ࡞ͬͯΔ• ෳۀϛϡʔδγϟϯ• MASHݭָஂɺFried Banana CabinɺϒϧʔάϥεˑϙϦε
σΟϨΫτϦΛPHP͔Β࡞Ε·͔͢ʁfunction makeDirectory(string $path): bool{//???}
mkdir() Ͱ༨༟ͩͥʂfunction makeDirectory(string $path): bool{return mkdir($path);}
mkdir() Ͱ༨༟ͩͥʂ͜ͷ࣮ͷΛग़དྷΔݶΓ্͛ͯΈ·͠ΐ͏ʂfunction makeDirectory(string $path): bool{return mkdir($path);}
σΟϨΫτϦύεΛࢦఆ͢ΔͱWarningmakeDirectory('test/foo/bar');//Warning: mkdir(): No such file or directory in /usr/local/code/mkdir.php on line 9• testσΟϨΫτϦɺfoo σΟϨΫτϦ͕ଘࡏ͠ͳ͍߹ Warning͕ൃੜ͢Δ• σΟϨΫτϦ࡞͞Εͳ͍
ϚχϡΞϧΛͪΌΜͱಡΉ• recursiveΦϓγϣϯmkdir ͷ —parents, -p Φϓγϣϯͱಉ͡• σΟϨΫτϦΛඞཁʹԠͯ͡࡞ͯ͘͠ΕΔmkdir(string $directory,int $permissions = 0777,bool $recursive = false,?resource $context = null): bool
recursive = trueΛ͏function makeDirectory(string $path): bool{return mkdir($path, recursive: true);}
σΟϨΫτϦ͕طʹଘࡏ͢ΔͱWarning• ࡞લʹis_dir(),file_exists()ͰνΣοΫ͕ඞཁ• ͜ΕϚχϡΞϧʹॻ͍ͯ͋ΔmakeDirectory('foo');makeDirectory('foo');// Warning: mkdir(): File exists in /usr/local/code/mkdir.php on line 9
is_dir,file_existsΛ͏function makeDirectory(string $path): bool{if (is_dir($path)) {return true;}if (file_exists($path)) {return false;}return mkdir($path, recursive: true);}✴file_exists() ͕ trueͷͱ͖݁ՌతʹσΟϨΫτϦ͕࡞Ͱ͖ͳ͍ͷͰҙ
σΟϨΫτϦ͕ͳ͍ͷʹis_dir͕trueΛฦ͢makeDirectory('foo/bar');makeDirectory('foo/bar');sleep(10); //͜͜Ͱผϓϩηε͔Βfoo/barσΟϨΫτϦΛআ͢ΔmakeDirectory('foo/bar');
σΟϨΫτϦ͕ͳ͍ͷʹis_dir͕trueΛฦ͢makeDirectory('foo/bar');makeDirectory('foo/bar');sleep(10); //͜͜Ͱผϓϩηε͔Βfoo/barσΟϨΫτϦΛআ͢ΔmakeDirectory('foo/bar');σΟϨΫτϦ͕࡞͞Εͳ͍ʂ
is_dir()Ωϟογϡ͞Ε͍ͯΔʂ• is_dir()ͳͲͷ݁ՌύϑΥʔϚϯεͷͨΊʹΩϟογϡ͞ΕΔ• Ωϟογϡϓϩηε͝ͱʹ࡞͞ΕΔɻ• ଞͷϓϩηεʹΑͬͯϑΝΠϧͷεςʔλε͕มΘΔ߹ΩϟογϡͷΫϦΞ͕ඞཁ
clearstatcache()Λ͏function makeDirectory(string $path): bool{clearstatcache();if (is_dir($path)) {return true;}if (file_exists($path)) {return false;}return mkdir($path, recursive: true);}
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͕ਖ਼͘͠ಈ࡞͢Δ
࣮ߦλΠϛϯάʹΑͬͯWarningis_dir()is_dir()file_exits()file_exits()ϓϩηε1ϓϩηε2·ͩσΟϨΫτϦ͕ ଘࡏ͠ͳ͍ͷͰGBMTF
࣮ߦλΠϛϯάʹΑͬͯWarningis_dir()is_dir()file_exits()file_exits()mkdir()ϓϩηε1ϓϩηε2σΟϨΫτϦ࡞ޭ
࣮ߦλΠϛϯάʹΑͬͯWarningis_dir()is_dir()file_exits()file_exits()mkdir()mkdir()ϓϩηε1ϓϩηε2σΟϨΫτϦ࡞ࣦഊʂ
Τϥʔͷ͑ํ• Τϥʔ੍ޚԋࢉࢠ `@` Λ͏ खܰɻͳΜ͔ෛ͚ͨؾ͕͢Δɻ• error_reporting Ͱ E_WARNINGΛ͑Δ ଞͷE_WARNING͑ͯ͠·͏ͷͰ͓קΊ͠ͳ͍• set_error_handler ͰWarningΛΩϟον͢Δ ਅ໘ʹΔͳΒ͜Εɻ• ഉଞ੍ޚʁʁ ΦʔόʔΩϧͰʁ͜ͷϝιουҎ֎͔Βͷݺͼग़͠ʹউͯͳ͍ɺɺɺ
Τϥʔ੍ޚԋࢉࢠΛͬͨ߹function makeDirectory(string $path): bool{if (@mkdir($path, recursive: true) === false) {clearstatcache();return is_dir($path);}return true;}• Τϥʔ੍ޚʹͤͯࣄલͷσΟϨΫτϦνΣοΫෆཁʢ͔ʣ
Permission• ͦͦ࡞ݖݶ͕ͳ͍߹E_WARNING͕ൃੜ• is_writableͰ֬ೝՄೳ• σΟϨΫτϦ͕͋Δͱ͖ɺͳ͍ͱ͖͕͋ΔͷͰ࠶ؼ͕ඞཁ• ͏࣮ߦ࣮ͯ͠ߦͰ͖Δ͔ࢼͨ͠ํ͕ૣ͘ͳ͍ʁʁ →Τϥʔ੍ޚඞਢ
·ͱΊ• mkdirͳͲϑΝΠϧγεςϜʹ৮Δ߹ߟྀϙΠϯτଟ͍• ϚχϡΞϧͪΌΜͱಡ͏• ϑΝΠϧγεςϜͷΩϟογϡϋϚΔͱͭΒ͍ͷͰɺ clearstatcacheΛ͍·͠ΐ͏• ύʔϛογϣϯΉ͔͍ͣ͠• Ͳ͏ؤுͬͯWarningಀΕΒΕͳ͍ͷͰɺ Τϥʔ੍ޚ͕ΜΓ·͠ΐ͏
αΠϘζPHPerKaigi ޙஊΠϕϯτʂhttps://cybozu.connpass.com/event/277790/4/5ʢਫʣ 19:00~ @αΠϘζຊڮΦϑΟε