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
PHPで理解するストリーム処理
Search
Rei
May 14, 2025
Programming
0
55
PHPで理解するストリーム処理
Rei
May 14, 2025
Tweet
Share
More Decks by Rei
See All by Rei
Laravel Eloquentで複数レコードが削除された話
sonor04ls
0
76
Laravelで簡単リアルタイム通信
sonor04ls
0
69
Other Decks in Programming
See All in Programming
Oxlintはいいぞ
yug1224
5
1.3k
Amazon Bedrockを活用したRAGの品質管理パイプライン構築
tosuri13
5
740
AI によるインシデント初動調査の自動化を行う AI インシデントコマンダーを作った話
azukiazusa1
1
740
SourceGeneratorのススメ
htkym
0
200
20260127_試行錯誤の結晶を1冊に。著者が解説 先輩データサイエンティストからの指南書 / author's_commentary_ds_instructions_guide
nash_efp
1
980
MUSUBIXとは
nahisaho
0
140
IFSによる形状設計/デモシーンの魅力 @ 慶應大学SFC
gam0022
1
310
Honoを使ったリモートMCPサーバでAIツールとの連携を加速させる!
tosuri13
1
180
FOSDEM 2026: STUNMESH-go: Building P2P WireGuard Mesh Without Self-Hosted Infrastructure
tjjh89017
0
170
登壇資料を作る時に意識していること #登壇資料_findy
konifar
4
1.2k
AIによる開発の民主化を支える コンテキスト管理のこれまでとこれから
mulyu
3
350
並行開発のためのコードレビュー
miyukiw
0
250
Featured
See All Featured
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
310
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
320
The agentic SEO stack - context over prompts
schlessera
0
640
Balancing Empowerment & Direction
lara
5
890
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.1k
The Cult of Friendly URLs
andyhume
79
6.8k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
54
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
76
Game over? The fight for quality and originality in the time of robots
wayneb77
1
120
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
280
Transcript
PHPで理解するストリーム処理 PHPで理解するストリーム処理 1
このスライドの目的 先日、大量のCSVデータを扱うAPIを実装していた時のこと… 「Laravelの response()->stream() って何してるんだっけ?」 「そもそもStream処理って何だっけ?」 「よく分からないものを使うのは気持ち悪い」 というわけで、ストリーム処理の基礎をまとめてみました! PHPで理解するストリーム処理 2
PHPストリームとは? データを連続的な流れとして扱う仕組み ファイル、ネットワーク、データ圧縮など様々な操作を統一 「データの流れ」を抽象化したもの 大きなデータや総量が確定していないデータを効率的に処理 例え: 川の流れのように、データが少しずつ流れてくるイメージ PHPで理解するストリーム処理 3
ググってみた結果 これだけではいまいち理解できない... よくある説明 データを連続的な流れとして扱う仕組みで、ファイル、ネットワーク、データ圧縮など の操作を共通のインターフェースで扱えるようにしたものです。 具体的に何がいいのか比べてみよう! PHPで理解するストリーム処理 4
非ストリーム的な処理 非ストリーム的な処理: データの位置を意識する必要がある(配列の何番目?キーは何?) 全データを一度にメモリに読み込む // 非ストリーム処理 $content = file_get_contents('large_file.txt'); //
全データを一度に読み込み $lines = explode("\n", $content); // 行ごとに分割 foreach ($lines as $line) { // 各行を処理 // ここで何かの処理をする } PHPで理解するストリーム処理 5
ストリーム的な処理 ストリーム的な処理: 先頭から最後まで順番に処理 データの位置を意識する必要がない 処理しながら読み込む // ストリーム処理 $handle = fopen('large_file.txt',
'r'); // ファイルを開くだけ while (($line = fgets($handle)) !== false) { // 1行ずつ読み込み // 各行を処理 // ここで何かの処理をする } fclose($handle); // 後片付け PHPで理解するストリーム処理 6
ストリーム処理の特徴 1. メモリ効率 大きなファイルでも全体をメモリに読み込まずに少しずつ処理可能 メモリ使用量を大幅に削減できる 2. 統一されたインターフェース ファイル、HTTP、FTP、圧縮データなど様々なソースを同じ方法で処理 どのようなデータソースでも同じコードパターンで扱える 3.
リアルタイム処理 データが到着次第処理を開始できる 全データを受信する前に処理を始められる PHPで理解するストリーム処理 7
ストリーム処理と非ストリーム処理の比較テスト テスト方法 1. テスト用に約100MBのテキストファイルを作成 2. テキストファイルの読み込み速度、使用メモリを比較 非ストリーム処理: file_get_contents() ストリーム処理: fopen()
+ fgets() 3. 処理時間とメモリ使用量を計測 PHPで理解するストリーム処理 8
比較結果(数値で見る差) 非ストリーム処理(file_get_contents) -------------------------------------------- 処理時間: 0.2070 秒 メモリ使用量: 231.75 MB 処理した行数:
209,301 ストリーム処理(fgets) -------------------------------------------- 処理時間: 0.0445 秒 メモリ使用量: 32 B // わずか32バイト! 処理した行数: 209,300 ============================================ メモリ使用量の差: 231.75 MB (非ストリームは7,594,135.0倍) 処理時間の差: 0.1625 秒 (非ストリームは4.7倍遅い) PHPで理解するストリーム処理 9
Laravelでのストリーム処理 Laravelの response()->stream() でCSVダウンロードを実装: // CSV出力のストリームレスポンス return response()->stream( function ()
{ echo "ID,名前,Email\n"; // ヘッダー // 1000件ずつ処理 User::chunk(1000, function ($users) { foreach ($users as $user) { echo "{$user->id},{$user->name},{$user->email}\n"; flush(); } }); }, 200, ['Content-Type' => 'text/csv'] ); PHPで理解するストリーム処理 10
APIデータ受信での活用例 JSONデータを受け取る場合のコード例: // リクエストボディからJSONデータを取得 $jsonData = file_get_contents('php://input'); // JSONをデコード $data
= json_decode($jsonData, true); // 処理 if ($data) { // JSONデータを使った処理 echo json_encode(['status' => 'success', 'data' => $data]); } PHPで理解するストリーム処理 11
CSVファイル処理の例 シンプルなCSV読み込みの例: $handle = fopen('data.csv', 'r'); $headers = fgetcsv($handle); //
ヘッダー行を取得 while (($data = fgetcsv($handle)) !== FALSE) { // 各行をヘッダーと組み合わせて連想配列に $row = array_combine($headers, $data); // データ処理... processRow($row); } fclose($handle); PHPで理解するストリーム処理 12
まとめ ストリーム処理はデータを少しずつ処理する仕組み メモリ効率が高く、大量データ処理に適している 100MBのファイルでもわずか32バイトのメモリで処理可能! 処理速度も非ストリーム処理より約5倍速い PHPにはさまざまなストリームラッパーが用意されている APIやファイル処理で活用することでパフォーマンス向上が期待できる PHPで理解するストリーム処理 13
参考資料 PHP公式マニュアル - ストリーム PHP公式マニュアル - ストリームラッパー Laravel - ストリームダウンロードレスポンス
PHPで理解するストリーム処理 14
おまけ:主なPHPストリームラッパー ラッパー 説明 file:// ローカルファイルシステム(デフォルト) http:// , https:// HTTPSプロトコルリモートアクセス php://stdin
標準入力 php://stdout 標準出力 php://input リクエストボディのローデータ php://memory メモリ内一時ストリーム php://temp メモリ/一時ファイル自動切替 詳細はPHP公式マニュアルをご覧ください PHPで理解するストリーム処理 15