0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PHPのストリーム処理を理解する

Posted at

Laravelなどを使っていると簡単にAPIを実装できますが、バニラPHPを使っていると、JSONデータなどを受け取るために以下のような処理を書くことがあります。

$jsonData = file_get_contents('php://input');

普段何気なく使っていますが、「ストリーム」についてちゃんと調べたことがなかったので、残しておきます。

PHPストリームとは何か

AIに聞くとこんな回答がきました。

データを連続的な流れとして扱う仕組みで、ファイル、ネットワーク、データ圧縮などの操作を共通のインターフェースで扱えるようにしたものです。
ストリームとは「データの流れ」を抽象化したもので、大きなデータや総量が確定していないデータを効率的に処理するために使われます。例えるなら、川の流れのように、データが少しずつ流れてくるイメージです。

よく分からないのでもうちょと具体的にすると以下のようなイメージ。

非ストリーム的な処理
データを取り出すときに、「どこに欲しいデータがあるのか」(配列の何番目の要素?キーは何?)ということを意識する必要がある。

// 非ストリーム処理 - 全データを一度にメモリに読み込む
$content = file_get_contents('large_file.txt');
$lines = explode("\n", $content);
foreach ($lines as $line) {
    // 各行を処理
}

ストリーム的な処理
先頭から最後まで順番に処理するので、非ストリーム的な処理のようにどこにデータがあるか(配列の何番目にどんなデータがあるか)を意識する必要がない。

// ストリーム処理 - 1行ずつ読み込む
$handle = fopen('large_file.txt', 'r');
while (($line = fgets($handle)) !== false) {
    // 各行を処理
}
fclose($handle);

なぜストリーム処理の特徴

  1. メモリ効率: 大きなファイルでも全体をメモリに読み込まずに少しずつ処理できる
  2. 統一されたインターフェース: ファイル、HTTP、FTP、圧縮データなど様々なソースを同じ方法で扱える
  3. リアルタイム処理: データが到着次第処理を開始できる

PHPストリームラッパー一覧

下記に主要なPHPストリームラッパーを表形式でまとめます。
使えそうなものが結構ありますね。

ストリームラッパー 説明
file:// ローカルファイルシステムへのアクセス(デフォルト)
http:// HTTPプロトコルを使用したリモートファイルアクセス
https:// HTTPSプロトコルを使用したセキュアなリモートファイルアクセス
php://stdin 標準入力ストリーム
php://stdout 標準出力ストリーム
php://stderr 標準エラー出力ストリーム
php://input リクエストボディのロー(生)データにアクセス
php://output 出力バッファへの書き込み(echo/printと同様)
php://memory メモリ内一時ストリーム
php://temp 小さいデータはメモリ、大きいデータは一時ファイルに保存

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?