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
730
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
410
サイボウズ と Garoon と The PHP Foundation と 私 / Cybozu and Garoon and The PHP Foundation and me
oogfranz
PRO
1
610
サイボウズ #Garoon 開発チームの 「 完成度低いの歓迎LT大会 」 PHPerKaigi出張版 / Low quality LT in PHPerKaigi 2023
oogfranz
PRO
0
750
20年ものの巨大プロダクトをKubernetesに移行している話 後日談/Garoon on Kubernetes after talk
oogfranz
PRO
0
640
20年ものの巨大プロダクトをKubernetesに移行している話/Garoon on Kubernetes
oogfranz
PRO
0
560
PHPアプリケーションだってモニタリングしたい / Monitoring PHP application
oogfranz
PRO
1
670
効果的な静的解析の 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
670
Other Decks in Technology
See All in Technology
DMM.com 購入改善推進チーム におけるCodeRabbitを用いた レビューフロー改善の一例
ysknsid25
2
640
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
15
110k
完全自律ロボットを作りたくて、先に開発を自律させた話(ROS Japan UG #63 LT)
rryz09
0
610
生成AI×AWS CDK×AWS FISで"振り返れる"ミニGameDayをつくろう
yoshimi0227
1
160
クラウド上のデータ復旧で見落としがちな制約: 医療系 SaaS の BCP 設計から得た教訓
kakehashi
PRO
0
3.6k
Kaggleで成長するために意識したこと
prgckwb
2
360
実装だけじゃない! CCA-F取得エンジニアが教えるClaude Code開発プロセス活用術
diggymo
2
740
はじめてのWDM
miyukichi_ospf
1
140
ボーイスカウトルールでメモリやスキルを改善しよう
azukiazusa1
4
1.2k
「最後に責任を取るのはチーム」— 人間のPRレビューを最小化してアップデートしたメンタルモデル
jnishime_dresscode
0
710
Terraform共通モジュールをチーム横断で“変えられる”運用へ ― リリースと適用の分離
kekke_n
1
3k
CDKで書くECSのベストプラクティス、 改めて考え直す2026 #cdkconf2026
makies
1
490
Featured
See All Featured
How to build a perfect <img>
jonoalderson
1
5.8k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
180
RailsConf 2023
tenderlove
30
1.5k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
GitHub's CSS Performance
jonrohan
1033
470k
Deep Space Network (abreviated)
tonyrice
0
220
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
A better future with KSS
kneath
240
18k
Skip the Path - Find Your Career Trail
mkilby
1
170
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
210
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~ @αΠϘζຊڮΦϑΟε