PHP8でストリーム操作極め
PHP8でのストリーム操作の概要
PHP8ではストリーム操作がより高速かつ安全に行えるように改良が加えられました。ストリームはデータの流れを抽象化し、ファイル、ソケット、メモリ領域などを統一的に扱うことができます。ストリーム操作は、ファイルポインタやリソースを介して行われ、データフローを効率的に設計するための基盤となります。
php://inputと標準入力
HTTPリクエストのボディを直接読み込むには php://input ストリームを使用します。これは標準入力と同様にバイナリデータを扱えるため、JSONやXML、CSVなどの非テキストデータもそのまま取得できます。
$rawData = file_get_contents('php://input');
var_dump($rawData);
標準入力を扱う場合は php://stdin を利用し、CLIスクリプトでユーザー入力をリアルタイムに取得できます。
fopenとファイルポインタ
ファイルを開く際は fopen を使い、戻り値としてファイルポインタ(リソース)を取得します。このポインタを使って fread、fwrite、fgets などの関数でデータを読み書きします。
$fp = fopen('data.txt', 'r');
while (($line = fgets($fp)) !== false) {
echo $line;
}
fclose($fp);
ファイルポインタはリソースとして管理され、使用後は必ず fclose で解放することが推奨されます。
fgetcsvでCSV読み込み
CSVファイルを行単位で読み込むには fgetcsv が便利です。ヘッダー行をスキップしたり、区切り文字を変更したりするオプションもあります。
$fp = fopen('sample.csv', 'r');
$header = fgetcsv($fp); // ヘッダー行を取得
while (($row = fgetcsv($fp)) !== false) {
$data = array_combine($header, $row);
// ここでデータを処理
}
fclose($fp);
fgetcsv は内部でストリームを読み込み、配列として返すため、データフローを簡潔に扱えます。
ストリームラッパーとphp://output
ストリームラッパーは、php:// 系の特殊ストリームを通じて、標準出力や標準エラー、メモリ領域などにアクセスできます。php://output は echo と同等の出力先を提供し、ファイルに書き込む代わりにブラウザへ直接送信します。
$fp = fopen('php://output', 'w');
fwrite($fp, "Hello, world!\n");
fclose($fp);
このようにストリームラッパーを使うことで、データフローを柔軟に制御でき、例えば CSV を直接ブラウザにダウンロードさせる処理も簡単に実装できます。
データフローとリソース管理
PHP8 ではストリーム操作を行う際に、リソースの管理が重要です。ファイルポインタやストリームラッパーはリソースとして扱われ、メモリリークを防ぐために fclose で必ず解放する必要があります。また、stream_get_contents や stream_set_timeout などの関数を組み合わせることで、非同期処理やタイムアウト制御も可能です。
データフローを設計する際は、入力(php://input)、処理(fgetcsv、ストリームラッパー)、出力(php://output)という三段階を意識し、各段階でリソースを適切に開閉することで、スケーラブルで安全なアプリケーションを構築できます。
コメント
コメントを投稿