処理としてはDBの内容を、テキストに書き出しているのですが
文字数が多い場合、以下のエラーが出現するようです。
Warning: Cannot modify header information - headers already sent by (output started at ....
解決法に心当たりのある方、ご教授お願い致します。
以下に、一連の処理を記述します。
//------------------------------------------------ファイル生成
// 作成するファイル名の指定
$file_name = 'output_text/file.txt';
// ファイルの存在確認
if( !file_exists($file_name) ){
touch( $file_name );// ファイル作成
}else{
// すでにファイルが存在する場合は、削除してから生成
unlink($file_name);
touch( $file_name );
}
//---------------------------------------------データ書き込み
$fp = fopen($file_name, "w"); // 新規書き込みモードで開く
$data= isset($dataArray[1][1]) ? $dataArray[1][1] : ""; ←このデータの文字数が多いとエラー
fwrite($fp, $data."\r\n\r\n");
fclose($fp);
//ファイルへの書き込みは終了
readfile($file_name);
//---------------------------------------------ダウンロード
header("Content-Disposition: attachment; filename=$file_name");
header("Content-Length: ".$file_name);
header("Content-Type: application/octet-stream");
header("Connection: close");
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+3
Warning: Cannot modify header information - headers already sent by (output started a
header よりも前で何かの文字列などが出力されていることによるエラーメッセージです。
$data= isset($dataArray[1][1]) ? $dataArray[1][1] : "";
この部分で何らかのエラーメッセージが出ているのであろうと推測しますが、開発時にエラーメッセージを表示するようにすることは基本です。
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
を記述してエラーメッセージを表示すること。
投稿
score 12607
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
header("Content-Length: ".$file_name);
この部分、ファイル名ではなくファイルサイズをセットするようにしないと
正常に動作しないのではないでしょうか?
少し気になりました。
投稿
score 151
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
header
関数を呼び出す前にecho
やprint
、var_dump
を呼んでいても、該当のエラーメッセージが表示されるようです。
デバッグのためにそれらを仕込んでいないか、確認されてみてはいかがでしょうか?
あと、今回 検証してみて分かったのですが、
header
関数を呼び出す前に何らかのエラーメッセージが出力されていても、該当のエラーが発生します。
事前の処理で何らかのエラーが発生していないかも、併せて確認してみると良いでしょう。
<?php
$fp = fopen('/tmp/test2.txt', 'w');
fwrite($fp); // ここでわざとエラーメッセージを発生させる
header("Content-Type: text/html; charset=UTF-8");
?>
実行結果
PHP Warning: fwrite() expects at least 2 parameters, 1 given in /tmp/test.php on line 3
Warning: fwrite() expects at least 2 parameters, 1 given in /tmp/test.php on line 3
PHP Warning: Cannot modify header information - headers already sent by (output started at /tmp/test.php:3) in /tmp/test.php on line 5
Warning: Cannot modify header information - headers already sent by (output started at /tmp/test.php:3) in /tmp/test.php on line 5
※このような場合、まずはエラーメッセージで検索することをお勧めします。
たいていの場合、先人が原因と解決策を公開してくれています。
今回のケースも、以下のようにいろいろ見つかりました。
http://ja.stackoverflow.com/questions/5453/php-の-headers-already-sent-エラーはどう直したらいいですか
http://d.hatena.ne.jp/hsh1smcg/20120407/1333764042
http://php.net/manual/ja/function.header.php
投稿
score 4625
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
エラーとなるのは、この上限を超えた為だと思います。
対策:
・文字列変数に入っている文字数を監視する(文字を追加するするたびに、文字数を増やす)、
・文字数が一定の値(例えば、1.5GB)を超えたら、文字列変数をファイルに書き込み、その後で文字列変数を空に、文字列を0にそれぞれ変更する。
というようにプログラムを変更してください。
投稿
score 2870
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
check解決した方法
-1
//この行を、headerの下に移動したところ問題なく動作しました。(記述位置が悪かったようです)
readfile($file_name);
回答してくださった方、有難うございました!!
投稿
score 59
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
91.10%
Brownie
2015/10/29 17:21
error_reporting(E_ALL);
有難うございます。
こちらを試してみましたが、表示されるエラーは特に変わらないようです。
Kosuke_Shibuya
2015/10/29 17:22
Kosuke_Shibuya
2015/10/29 17:29
ini_set('display_errors', 1);
error_reporting(E_ALL);
をかいて、header() 部分はコメントアウトしないといけませんよ。
Brownie
2015/10/29 17:34
header() 部分はコメントアウトしてみましたが、特にほかのエラーはなしです。
少し気になったのが、readfileの部分をコメントアウトすると、エラーは出ず
何も表示されていないテキストファイルがダウンロードされます。
(その際、サーバ側にはきちんと書き込まれています)
readfileの部分が疑わしく感じていますが、解決には至っていません。
Kosuke_Shibuya
2015/10/29 17:41
> 何も表示されていないテキストファイルがダウンロードされます。
readfile が何をする関数かをお分かりではないようですが…
質問以前に、リファレンスくらいは読んでください。