13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

php://outputが書き込みの途中で出力される

Last updated at Posted at 2019-06-04

調べたのでメモ。
※信憑性は自信なし。

※コメントを読んでください。

<?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 に値が設定されていたことが原因のようでした。

php.ini
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();

なぜ初めからこう書いていなかったのか...?
でもおかげで調べたのでよし。

13
10
6

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
13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?