Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
PHPで理解するストリーム処理
Search
Rei
May 14, 2025
Programming
91
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PHPで理解するストリーム処理
Rei
May 14, 2025
More Decks by Rei
See All by Rei
Laravel Eloquentで複数レコードが削除された話
sonor04ls
0
90
Laravelで簡単リアルタイム通信
sonor04ls
0
88
Other Decks in Programming
See All in Programming
Simple Storage Service(S3) is not simple
iwatsukayura
0
290
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.2k
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
1
440
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
500
Domain-Driven Transformation
hschwentner
2
2.3k
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
290
AWSに止められる覚悟してますか?
morizo_1984
2
540
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
1k
Kotlinの15年とServer-Side Kotlin
n_takehata
1
150
dotNET_vulnclicker_intro.pdf
deka_morita
0
140
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
28
32k
Featured
See All Featured
Believing is Seeing
oripsolob
1
240
Reflections from 52 weeks, 52 projects
jeffersonlam
356
22k
Statistics for Hackers
jakevdp
799
230k
Embracing the Ebb and Flow
colly
88
5.2k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
GitHub's CSS Performance
jonrohan
1033
470k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
480
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
550
A Tale of Four Properties
chriscoyier
163
24k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
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