[PHP] headers already sent by ... | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

ブラウザからファイルをダウンロードさせるために、header() 関数を使用して HTTP ヘッダを出力したあとファイルを出力するようなスクリプトを作成してみたところ、

    .
    .
    .
    header( 'Content-Type: "text/comma-separated-values"' );
    header( 'Content-Disposition: attachment; filename="list.csv"' );
    header( 'Content-Transfer-Encoding: binary' );
    .
    .
    .
    fpassthru( $tempfile );
    .
    .
    .

なぜか最初の header() 関数の呼び出し時に以下の警告が発生し、うまくいきません。

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\downloadFile.php:17) in C:\xampp\htdocs\downloadFile.php on line 29

出力した覚えはないのに...としばらく嵌っていたのですが、header() 関数を呼び出すより前にデバッグ目的で print() 関数を使って変数の値を出力していたのが原因だったようです。

print() 関数を実行すると、HTTP ヘッダが内部的に自動出力されるんですね。そこへさらに HTTP ヘッダを出力しようとしたために警告が出たというわけです。

よくよく考えれば当たり前のことなんですが、PHP にはまだ慣れていないのでこんなことでよく躓きます。