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
#phperbiglt のLT
Search
hideki kinjyo
PRO
December 20, 2025
Programming
93
0
Share
#phperbiglt のLT
https://connpass.com/event/372021/
でのLT資料です
hideki kinjyo
PRO
December 20, 2025
More Decks by hideki kinjyo
See All by hideki kinjyo
ソースコード→AST→オペコード、の旅を覗いてみる
o0h
PRO
1
130
PCOVから学ぶコードカバレッジ #phpcon_odawara
o0h
PRO
0
330
夢の無限スパゲッティ製造機 -実装篇- #phpstudy
o0h
PRO
0
230
夢の無限スパゲッティ製造機 #phperkaigi
o0h
PRO
0
460
PHPer Book Revue 「雑に作る」 #phperkaigi
o0h
PRO
0
350
俺にも私がAIと作った オススメの個人ツールを語らせてくれ
o0h
PRO
0
59
手軽に積ん読を増やすには?/読みたい本と付き合うには?
o0h
PRO
1
270
symfony/mcp-bundleで、既存アプリケーションもお手軽にMCPサーバー化
o0h
PRO
1
160
組織もソフトウェアも難しく考えない、もっとシンプルな考え方で設計する #phpconfuk
o0h
PRO
10
5.9k
Other Decks in Programming
See All in Programming
「OSSがあるなら自作するな」は AI時代も正しいか ── Build vs Adopt の新しい判断基準
kumorn5s
7
2k
Explore CoroutineScope
tomoeng11
0
170
Liberating Ruby's Parser from Lexer Hacks
ydah
2
2.6k
ハーネスエンジニアリングにどう向き合うか 〜ルールファイルを超えて開発プロセスを設計する〜 / How to approach harness engineering
rkaga
28
19k
ハーネスエンジニアリングとは?
kinopeee
13
6.8k
🦞OpenClaw works with AWS
licux
1
340
Import assertionsが消えた日~ECMAScriptの仕様はどう決まり、なぜ覆るのか~
bicstone
2
180
Programming with a DJ Controller — not vibe coding
m_seki
3
790
[RubyKaigi 2026] Require Hooks
palkan
1
300
when storing skills in S3 file
watany
3
1.3k
実践ハーネスエンジニアリング:ステアリングループを実例から読み解く / Practical Harness Engineering: Understanding Steering Loops Through Real-World Examples
nrslib
5
4.4k
From Formal Specification to Property Based Test
ohbarye
0
730
Featured
See All Featured
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
210
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.1k
Heart Work Chapter 1 - Part 1
lfama
PRO
6
35k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.8k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
180
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
290
Prompt Engineering for Job Search
mfonobong
0
290
Marketing to machines
jonoalderson
1
5.2k
sira's awesome portfolio website redesign presentation
elsirapls
0
230
Transcript
あ〜忘れたい、思い出したくもないね PHPer大忘LT会 2025 Hideki Kinjyo GitHub: o0h / X: @o0h_
[発表用] v1.1.0
世間はすっかり年の瀬。  2
世間はすっかり年の瀬。 師走、年末、年納め。  3
忘年会。 PHPer大忘LT会。  4
忘年会。 PHPer大忘LT会。  5
忘年会。 PHPer大忘LT会。  6
忘れたい記憶。 消したい記録。  7
忘れたい忘れたい忘れたい忘れたい  8
忘れたい. . .  9
と言えば、一時ファイル  10
思い出されることがあってはイケナイ  11
1. PHPで一時ファイルを使うための色々7選 2. 一時ファイルがいつ消えるのか
一時ファイル? • リクエストやプロセス処理の中で読み書きを行う • 処理が終わったら、書き込まれたデータが削除される • ↑この要件をどうやって満たしていくか、を考えるのが今日のLT  13
1. sys_get_temp_dir()を使う  14
• 「一時ファイルのディレク トリ」を取得 • `/tmp` とか • 通常のファイル作成・書き込 み操作ができる •
ファイル名を任意のものに したい場合に便利  15 $path = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'file_no_namae_01'; $fp = fopen($path, 'r+'); // -------- // Կ͔ͷॲཧ // -------- fclose($fp); unlink($path);
2.tempnam()を使う  16
• 指定したディレクトリに、 指定したprefixでファイル を作成し、そのパスを返す • 第1引数: ディレクトリ • 第2引数: prefix
• ファイルのモードは0600 • 規則に沿った名前で、かつ 一意のファイルを作りたい 時に便利  17 $path = tempnam( sys_get_temp_dir(), 'file_no_namae_', ); $fp = fopen($path, 'r+'); // -------- // Կ͔ͷॲཧ // -------- fclose($fp); unlink($path);
3.自前のクラスの__destruct()で自動削除  18
• 自前でクラスを作成してど うにかする方式 • `$this->fp` みたいな所に ファイルハンドラを突っ込む • そのクラスのオブジェクト のdestructで削除処理が走
るようにする • 使い間違い・削除忘れなど が無くなりそうなので便利  19 public function __construct() {…} public function write( string $content ): void {…} public function __destruct() { @\fclose($this->fp); @\unlink($this->name); }
4.php://memory  20
• メモリ上にデータを展開す る記述方法 • 「ファイルを作らない」の で「ファイルを消し忘れ る」が起きない • ただし、書き込んだあと に、他のプロセスに渡すこ
とが出来ない  21 $fp = fopen( 'php://memory', 'r+', ); // -------- // Կ͔ͷॲཧ // -------- fclose($fp);
5.php://temp  22
• php://memoryと同じ使い方 • サイズが上限を超えた時に 実ファイルに書き出す • 閾値は任意に設定できる • 作成場所は `
sys_get_temp_dir()`の値 と同じ • サイズが大きいデータを扱 う時に便利 • 他のプロセスに渡せない、 はこちらでも同様  23 $fp = fopen( 'php://temp', 'r+', ); // -------- // Կ͔ͷॲཧ // -------- fclose($fp);
6.tmpfile() [+ stream_get_meta_data()]  24
• `fopen()`したのと同じリ ソースを返す • 作成されたファイルは、 処理が終わった時に自動で 削除される • 消し忘れがなくて便利 
25 $fp = tmpfile(); // -------- // Կ͔ͷॲཧ // -------- fclose($fp);
• `stream_get_meta_data()` で、その実体のファイル パスを取得することができ る • 何かしらのライブラリなど で、「パスを指定する」系 のケースにも対応できる 
26 $config = getenv('XXX_CONFIG'); $fp = tmpfile(); fwrite($fp, $config); fflush($fp); $meta = stream_get_meta_data($fp); $path = $meta['uri']; $client = new NanikaSdk( configFile: $path, ); $client->doSomething(); fclose($fp);
7.SplTempFileObject  27
• php://tempのようなやつ の、オブジェクト指向版 • インスタンスと一緒に自動 でファイルも削除される • 消し忘れがなくて便利 • 内部的には
`php://temp` `php://memory` を使ってい るっぽい • https://github.com/php/php- src/blob/9d5f2f1/ext/spl/ spl_directory.c#L2076-L2082  28 $file = new SplTempFileObject(); // -------- // Կ͔ͷॲཧ //ʢ$file->fwrite()ͳͲʣ // -------- unset($file);
1. PHPで一時ファイルを使うための色々7選 2. 一時ファイルがいつ消えるのか
システムの一時ディレクトリを使っている系 • sys_get_temp_dir(), tempnam()を使って、「普通にファイル書き出し」 を行っている場合 • あなたの書いたアプリケーションに関係なく、OS側の制御で自動的に 掃除してくれる(かも知れない) • 例:
@IT:/tmpのファイルがいつの間にか消えてしまう https://atmarkit.itmedia.co.jp/flinux/rensai/linuxtips/342deltmpdirfile.html  30
メモリ内で扱った場合 • php://memory や、php://temp(の設定値を超えない範囲)での書き込み を行っている場合 • `fclose()`や`unset()`された後やphp_request_shutdownのフェーズで 解放される、と教わりました! • まだ自分ではそこら辺の流れをちゃんと追えてないです、すみません!!
 31
tmpfile() • php://memory や、php://tempと同じように、`fclose()`,`unset()`さ れた後やphp_request_shutdownのフェーズで解放される • (ちょっとだけ見てみましょう)  32
tmpfile系 • `tmpfile()` の場合は、 `php_stdio_stream_data` 構造体に「一時ファイル覚 えておいてねフィールド」 があり、クリーンアップ時 にそれを利用している •
一時ファイルのパスが格納さ れている  33 typedef struct { FILE *file; int fd; unsigned is_process_pipe:1; unsigned is_pipe:1; unsigned cached_fstat:1; unsigned is_pipe_blocking:1; unsigned no_forced_fstat:1; unsigned is_seekable:1; unsigned _reserved:26; int lock_flag; zend_string *temp_name; zend_stat_t sb; } php_stdio_stream_data;
tmpfile系 • ステップ実行で追ってみると→  34
tmpfile系 • `tmpfile()` の場合は、 `php_stdio_stream_data` 構造体に 「一時ファイル覚えておいてね フィールド」があり、クリーンアッ プ時にそれを利用している 
35
tmpfile系 • `tmpfile()` の場合は、 `php_stdio_stream_data` 構造体に 「一時ファイル覚えておいてね フィールド」があり、クリーンアッ プ時にそれを利用している 
36
以上になります  37
最後の章
 39 嫌なこと、忘れてハッピーPHP 🍻
おしまい! お付き合いいただき ありがとうございました!!