Slide 1

Slide 1 text

ՄೳͳݶΓ࣮֬ʹ 
 mkdirΛ੒ޭͤ͞Δʹ͸ PHPerKaigi 2023 ͗͢΍·@MASHݭָஂ

Slide 2

Slide 2 text

Whoami • ਿࢁ ༞Ұ @oogFranz • αΠϘ΢ζͰେاۀ޲͚άϧʔϓ΢ΣΞ 
 Garoon (Ψϧʔϯ) ࡞ͬͯΔ • ෳۀϛϡʔδγϟϯ • MASHݭָஂɺFried Banana CabinɺϒϧʔάϥεˑϙϦε

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

ϚχϡΞϧΛͪΌΜͱಡΉ • recursiveΦϓγϣϯ͸mkdir ͷ —parents, -p Φϓγϣϯͱಉ͡ • ਌σΟϨΫτϦΛඞཁʹԠͯ͡࡞੒ͯ͘͠ΕΔ mkdir( string $directory, int $permissions = 0777, bool $recursive = false, ?resource $context = null ): bool

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

σΟϨΫτϦ͕طʹଘࡏ͢ΔͱWarning • ࡞੒લʹis_dir(), fi le_exists()ͰνΣοΫ͕ඞཁ • ͜Ε΋ϚχϡΞϧʹॻ͍ͯ͋Δ makeDirectory('foo'); makeDirectory('foo'); // Warning: mkdir(): File exists in /usr/local/ code/mkdir.php on line 9

Slide 10

Slide 10 text

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ͷͱ͖͸݁ՌతʹσΟϨΫτϦ͕࡞੒Ͱ͖ͳ͍ͷͰ஫ҙ

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

is_dir()͸Ωϟογϡ͞Ε͍ͯΔʂ • is_dir()ͳͲͷ݁Ռ͸ύϑΥʔϚϯεͷͨΊʹΩϟογϡ͞ΕΔ • Ωϟογϡ͸ϓϩηε͝ͱʹ࡞੒͞ΕΔɻ • ଞͷϓϩηεʹΑͬͯϑΝΠϧͷεςʔλε͕มΘΔ৔߹͸ ΩϟογϡͷΫϦΞ͕ඞཁ

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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͕ਖ਼͘͠ಈ࡞͢Δ

Slide 16

Slide 16 text

࣮ߦλΠϛϯάʹΑͬͯWarning is_dir() is_dir() fi le_exits() fi le_exits() ϓϩηε1 ϓϩηε2 ·ͩσΟϨΫτϦ͕ 
 ଘࡏ͠ͳ͍ͷͰGBMTF

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

Τϥʔͷ཈͑ํ • Τϥʔ੍ޚԋࢉࢠ `@` Λ࢖͏ 
 खܰɻͳΜ͔ෛ͚ͨؾ͕͢Δɻ • error_reporting Ͱ E_WARNINGΛ཈͑Δ 
 ଞͷE_WARNING΋཈͑ͯ͠·͏ͷͰ͓קΊ͠ͳ͍ • set_error_handler ͰWarningΛΩϟον͢Δ 
 ਅ໘໨ʹ΍ΔͳΒ͜Εɻ • ഉଞ੍ޚʁʁ 
 ΦʔόʔΩϧͰ͸ʁ͜ͷϝιουҎ֎͔Βͷݺͼग़͠ʹ͸উͯͳ͍ɺɺɺ

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

Permission • ͦ΋ͦ΋࡞੒ݖݶ͕ͳ͍৔߹΋E_WARNING͕ൃੜ • is_writableͰ֬ೝ͸Մೳ • ਌σΟϨΫτϦ͕͋Δͱ͖ɺͳ͍ͱ͖͕͋ΔͷͰ࠶ؼ͕ඞཁ • ΋͏࣮ߦ࣮ͯ͠ߦͰ͖Δ͔ࢼͨ͠ํ͕ૣ͘ͳ͍ʁʁ 
 →Τϥʔ੍ޚ͸ඞਢ

Slide 22

Slide 22 text

·ͱΊ • mkdirͳͲϑΝΠϧγεςϜʹ৮Δ৔߹͸ߟྀϙΠϯτ͸ଟ͍ • ϚχϡΞϧ͸ͪΌΜͱಡ΋͏ • ϑΝΠϧγεςϜͷΩϟογϡ͸ϋϚΔͱͭΒ͍ͷͰɺ 
 clearstatcacheΛ࢖͍·͠ΐ͏ • ύʔϛογϣϯΉ͔͍ͣ͠ • Ͳ͏ؤுͬͯ΋Warning͸ಀΕΒΕͳ͍ͷͰɺ 
 Τϥʔ੍ޚ͕Μ͹Γ·͠ΐ͏

Slide 23

Slide 23 text

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