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

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

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.
Avatar for Rei Rei
May 14, 2025

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

Avatar for Rei

Rei

May 14, 2025

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