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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Rei
May 14, 2025
Programming
77
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
82
Laravelで簡単リアルタイム通信
sonor04ls
0
79
Other Decks in Programming
See All in Programming
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
510
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
960
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
120
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
260
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
170
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
170
共通化で考えるべきは、実装より公開する型だった
codeegg
0
250
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
190
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
210
どこまでゆるくて許されるのか
tk3fftk
0
500
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
3
1.5k
5分で問診!Composer セキュリティ健康診断
codmoninc
0
370
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
247
13k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Git: the NoSQL Database
bkeepers
PRO
432
67k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
350
My Coaching Mixtape
mlcsv
0
170
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Done Done
chrislema
186
16k
Code Reviewing Like a Champion
maltzj
528
40k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
310
Building the Perfect Custom Keyboard
takai
2
810
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