Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHPで理解するストリーム処理

Avatar for Rei Rei
May 14, 2025

 PHPで理解するストリーム処理

Avatar for Rei

Rei

May 14, 2025
Tweet

More Decks by Rei

Other Decks in Programming

Transcript

  1. 非ストリーム的な処理 非ストリーム的な処理: データの位置を意識する必要がある(配列の何番目?キーは何?) 全データを一度にメモリに読み込む // 非ストリーム処理 $content = file_get_contents('large_file.txt'); //

    全データを一度に読み込み $lines = explode("\n", $content); // 行ごとに分割 foreach ($lines as $line) { // 各行を処理 // ここで何かの処理をする } PHPで理解するストリーム処理 5
  2. ストリーム的な処理 ストリーム的な処理: 先頭から最後まで順番に処理 データの位置を意識する必要がない 処理しながら読み込む // ストリーム処理 $handle = fopen('large_file.txt',

    'r'); // ファイルを開くだけ while (($line = fgets($handle)) !== false) { // 1行ずつ読み込み // 各行を処理 // ここで何かの処理をする } fclose($handle); // 後片付け PHPで理解するストリーム処理 6
  3. 比較結果(数値で見る差) 非ストリーム処理(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
  4. 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
  5. 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
  6. 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
  7. おまけ:主なPHPストリームラッパー ラッパー 説明 file:// ローカルファイルシステム(デフォルト) http:// , https:// HTTPSプロトコルリモートアクセス php://stdin

    標準入力 php://stdout 標準出力 php://input リクエストボディのローデータ php://memory メモリ内一時ストリーム php://temp メモリ/一時ファイル自動切替 詳細はPHP公式マニュアルをご覧ください PHPで理解するストリーム処理 15