Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
可能な限り確実にmkdirを成功させるには / Make mkdir
Search
Yuichi Sugiyama
PRO
March 25, 2023
Technology
760
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
可能な限り確実にmkdirを成功させるには / Make mkdir
PHPerKaigi 2023 のLTの資料です
Yuichi Sugiyama
PRO
March 25, 2023
More Decks by Yuichi Sugiyama
See All by Yuichi Sugiyama
20年以上続く PHP 大規模プロダクトを Kubernetes へ ── クラウド基盤刷新プロジェクトの4年間
oogfranz
PRO
0
470
サイボウズ と Garoon と The PHP Foundation と 私 / Cybozu and Garoon and The PHP Foundation and me
oogfranz
PRO
1
620
サイボウズ #Garoon 開発チームの 「 完成度低いの歓迎LT大会 」 PHPerKaigi出張版 / Low quality LT in PHPerKaigi 2023
oogfranz
PRO
0
780
20年ものの巨大プロダクトをKubernetesに移行している話 後日談/Garoon on Kubernetes after talk
oogfranz
PRO
0
660
20年ものの巨大プロダクトをKubernetesに移行している話/Garoon on Kubernetes
oogfranz
PRO
0
580
PHPアプリケーションだってモニタリングしたい / Monitoring PHP application
oogfranz
PRO
1
680
効果的な静的解析の CI導入パターンを求めて / Great static analysis with CI
oogfranz
PRO
3
4.1k
Dev-meets-Ops
oogfranz
PRO
1
1.1k
GitHub力の低い僕でも、 OSSコントリビュートできたワケ / GitHub Power
oogfranz
PRO
1
680
Other Decks in Technology
See All in Technology
Bet AI Day 2026丨Production-Ready AI Agents — エンタープライズの実務を任せるための設計と運用
layerx
PRO
4
2.6k
【視聴者参加型!】AWSセキュリティアンチパターンクイズ
syoshie
0
450
Nav2、Nav3 ... はたまた自作?〜 作って理解する Nav3 の設計意図 〜 / Nav2, Nav3 ... or Build Your Own? — Understanding Nav3's design intent by building it from scratch
yanzm
0
260
生成AI時代の クレデンシャルとパーミッション設計
nrinetcom
PRO
4
1.6k
ペアプロの価値はコードを書くことだけじゃない
codmoninc
PRO
0
130
多摩川(.dev)ランニング入門 / Tamagawa.dev#3
fujiwara3
3
390
Bet AI Day 2026丨AIによって本質に戻るシステムリスク管理
layerx
PRO
0
1.3k
Sony-DroidKaigi2026
sony
1
330
スクラムで身についていた動き方を、XPで捉え直してみた
codmoninc
PRO
1
290
Benchmarking Vector Databases: pgvector vs. LanceDB
tsho
0
150
Driving AI Adoption Using In-House GPUs to Serve Qwen
po3rin
2
460
少人数データチームのDevin活用実践事例
runandy16
2
450
Featured
See All Featured
Code Review Best Practice
trishagee
74
20k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
650
Side Projects
sachag
455
43k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
560
Embracing the Ebb and Flow
colly
88
5.2k
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
230
WENDY [Excerpt]
tessaabrams
12
39k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.3k
The agentic SEO stack - context over prompts
schlessera
0
900
The Limits of Empathy - UXLibs8
cassininazir
1
640
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Transcript
ՄೳͳݶΓ࣮֬ʹ mkdirΛޭͤ͞Δʹ PHPerKaigi 2023 ͗͢·@MASHݭָஂ
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);
}
σΟϨΫτϦύεΛࢦఆ͢ΔͱWarning makeDirectory('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(), fi le_exists()ͰνΣοΫ͕ඞཁ • ͜ΕϚχϡΞϧʹॻ͍ͯ͋Δ makeDirectory('foo'); makeDirectory('foo'); //
Warning: mkdir(): File exists in /usr/local/ code/mkdir.php on line 9
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ͷͱ͖݁ՌతʹσΟϨΫτϦ͕࡞Ͱ͖ͳ͍ͷͰҙ
σΟϨΫτϦ͕ͳ͍ͷʹ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͕ਖ਼͘͠ಈ࡞͢Δ
࣮ߦλΠϛϯάʹΑͬͯWarning is_dir() is_dir() fi le_exits() fi le_exits() ϓϩηε1 ϓϩηε2 ·ͩσΟϨΫτϦ͕
ଘࡏ͠ͳ͍ͷͰGBMTF
࣮ߦλΠϛϯάʹΑͬͯWarning is_dir() is_dir() fi le_exits() fi le_exits() mkdir() ϓϩηε1 ϓϩηε2
σΟϨΫτϦ࡞ޭ
࣮ߦλΠϛϯάʹΑͬͯWarning is_dir() is_dir() fi le_exits() fi le_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~ @αΠϘζຊڮΦϑΟε