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);
なぜストリーム処理の特徴
- メモリ効率: 大きなファイルでも全体をメモリに読み込まずに少しずつ処理できる
- 統一されたインターフェース: ファイル、HTTP、FTP、圧縮データなど様々なソースを同じ方法で扱える
- リアルタイム処理: データが到着次第処理を開始できる
PHPストリームラッパー一覧
下記に主要なPHPストリームラッパーを表形式でまとめます。
使えそうなものが結構ありますね。
ストリームラッパー | 説明 |
---|---|
file:// |
ローカルファイルシステムへのアクセス(デフォルト) |
http:// |
HTTPプロトコルを使用したリモートファイルアクセス |
https:// |
HTTPSプロトコルを使用したセキュアなリモートファイルアクセス |
php://stdin |
標準入力ストリーム |
php://stdout |
標準出力ストリーム |
php://stderr |
標準エラー出力ストリーム |
php://input |
リクエストボディのロー(生)データにアクセス |
php://output |
出力バッファへの書き込み(echo/printと同様) |
php://memory |
メモリ内一時ストリーム |
php://temp |
小さいデータはメモリ、大きいデータは一時ファイルに保存 |