調べたのでメモ。
※信憑性は自信なし。
※コメントを読んでください。
<?php
$array = getArray(); // BDとから取得
$file = new SplFileObject('php://output', 'w');
foreach($array as $row) {
$file->fputcsv($row);
}
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=sample.csv');
header('Content-Transfer-Encoding: binary');
$file->fflush();
$arrayの中身が大きくなると
Warning: Cannot modify header information - headers already sent by がでた。
しかも環境によって出たり出なかったり。
output_buffering に値が設定されていたことが原因のようでした。
output_buffering=4096
output_buffering boolean/integer
このディレクティブを 'On' と設定することにより、全てのファイルに 関して出力バッファリングを有効にすることができます。 特定の大きさにバッファの大きさを制限したい場合、このディレクティブの 値として 'On' の代わりに最大バイト数(例:output_buffering=4096) を使用することができます。 PHP-CLI ではこのディレクティブが常に Off となります。
output_bufferingに'on'もしくは最大バイト数をあげればエラーが消えました。
php://output
php://output は書き込み専用のストリームで、 print および echo と同じ方法での出力バッファへの書き込みを許可します。
出力バッファへの書き込んでいたけれど、設定されていたバッファの最大バイト数に達したので出力されていたよう
※予想の範疇を出ていません。違ったら教えてください。
修正
<?php
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=sample.csv');
header('Content-Transfer-Encoding: binary');
$array = getArray(); // BDとから取得
$file = new SplFileObject('php://output', 'w');
foreach($array as $row) {
$file->fputcsv($row);
}
$file->fflush();
なぜ初めからこう書いていなかったのか...?
でもおかげで調べたのでよし。