CSVダウンロード機能などを実装していて、動くコードはかけていますが、内容をよく理解していないことも多かったです。
今回はストリームについて。
ストリームとは
主にデータの総量がわからないケースでよく使われるデータの提供方法になります。
1 |
$fp = fopen("data.txt","r"); |
上記もストリーム処理ですね。
ポインタを設定し、これをループの中で、回すことでデータを取得しています。
参考リンク
ファイル書き込みの場合にはストリームの対象が data.txt などになりますが、CSVダウンロードなどの場合には実体のあるデータに書き込みをするわけではありません。
この場合、PHP自身が用意しているメモリやテンポラリファイルのような場所に一時的にファイルをためておき、そこからデータをダウンロードするようにします。
具体的には php://memory、php://temp のようなものが該当します。
1 2 3 4 5 6 7 |
$stream = fopen('php://temp', 'r+b'); array_unshift($datas, $headers); foreach ($datas as $data) { fputcsv($stream, $data, $delimiter); } rewind($stream); $csv = str_replace(PHP_EOL, "\r\n", stream_get_contents($stream)); |
CSVダウンロード機能の実装として、上記のような処理がある場合、
1 2 3 4 5 |
$stream = fopen('php://temp', 'r+b'); foreach ($datas as $data) { fputcsv($stream, $data, $delimiter); } rewind($stream); |
この部分で、ストリームを使ってデータを格納しています。(rewindはファイルポインタの位置を先頭にということなので、fopenのfcloseに相当するものと思われます。)
1 |
$csv = str_replace(PHP_EOL, "\r\n", stream_get_contents($stream)); |
は実際にストリームからデータを取得します。
CSV出力ではデータが増えた時に、メモリやCPU効率など考える場所が複数あります。
色々見ていくと、ストリームを使ってブラウザに直接データを返すのが安全かもしれませんね。
参考リンク