質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

5回答

5668閲覧

phpのfwriteで文字数が多いとエラー

Brownie

総合スコア71

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/10/29 07:19

編集2015/10/29 07:22

現在、テキストファイルの出力にfwriteを使っています。

処理としては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");

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

Warning: Cannot modify header information - headers already sent by (output started a

header よりも前で何かの文字列などが出力されていることによるエラーメッセージです。

$data= isset($dataArray[1][1]) ? $dataArray[1][1] : "";

この部分で何らかのエラーメッセージが出ているのであろうと推測しますが、開発時にエラーメッセージを表示するようにすることは基本です。

php

1<?php 2ini_set('display_errors', 1); 3error_reporting(E_ALL);

を記述してエラーメッセージを表示すること。

投稿2015/10/29 08:00

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Brownie

2015/10/29 08:21

ini_set('display_errors', 1); error_reporting(E_ALL); 有難うございます。 こちらを試してみましたが、表示されるエラーは特に変わらないようです。
退会済みユーザー

退会済みユーザー

2015/10/29 08:22

だとすると、BOMの可能性を疑ってください。
退会済みユーザー

退会済みユーザー

2015/10/29 08:29

ini_set('display_errors', 1); error_reporting(E_ALL); をかいて、header() 部分はコメントアウトしないといけませんよ。
Brownie

2015/10/29 08:34

返信有難う御座います! header() 部分はコメントアウトしてみましたが、特にほかのエラーはなしです。 少し気になったのが、readfileの部分をコメントアウトすると、エラーは出ず 何も表示されていないテキストファイルがダウンロードされます。 (その際、サーバ側にはきちんと書き込まれています) readfileの部分が疑わしく感じていますが、解決には至っていません。
退会済みユーザー

退会済みユーザー

2015/10/29 08:41

> 少し気になったのが、readfileの部分をコメントアウトすると、エラーは出ず > 何も表示されていないテキストファイルがダウンロードされます。 readfile が何をする関数かをお分かりではないようですが… 質問以前に、リファレンスくらいは読んでください。
guest

0

エラーの原因としては、私もKosuke_Shibuya様の回答の通りだと思います。

header関数を呼び出す前にechoprintvar_dumpを呼んでいても、該当のエラーメッセージが表示されるようです。
デバッグのためにそれらを仕込んでいないか、確認されてみてはいかがでしょうか?

あと、今回 検証してみて分かったのですが、header関数を呼び出す前に何らかのエラーメッセージが出力されていても、該当のエラーが発生します。

事前の処理で何らかのエラーが発生していないかも、併せて確認してみると良いでしょう。

php

1<?php 2$fp = fopen('/tmp/test2.txt', 'w'); 3fwrite($fp); // ここでわざとエラーメッセージを発生させる 4 5header("Content-Type: text/html; charset=UTF-8"); 6?>

実行結果

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

投稿2015/10/29 08:46

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2015/10/29 08:49

回答書いているうちに解決されたようですねw
Brownie

2015/10/30 00:30

コメントに気づきました!丁寧に有難うございます。 頂いたコメントは今後の参考に致します。 試行錯誤ではなくしっかり原因究明できるよう努めさせて頂きます。
guest

0

こんにちわ。

header("Content-Length: ".$file_name);

この部分、ファイル名ではなくファイルサイズをセットするようにしないと
正常に動作しないのではないでしょうか?
少し気になりました。

投稿2015/10/29 07:53

srsnsts

総合スコア480

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Brownie

2015/10/29 08:22

有難うございます。勉強になります。 今後気を付けます! //header("Content-Length: ".$file_name); header('Content-Length: ' . filesize($file_name)); このように変更致しました。 $file_name ←path含む しかし、エラーの解決には至りませんでした。
guest

0

自己解決

//この行を、headerの下に移動したところ問題なく動作しました。(記述位置が悪かったようです)
readfile($file_name);

回答してくださった方、有難うございました!!

投稿2015/10/29 08:41

Brownie

総合スコア71

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/10/29 09:38

自己レスをベストアンサーにすると他の方から頂いた回答でどれが参考になったかわからないので、次回から一番参考になった回答をベストアンサーにされる方がよいですよ。 # 本来のコメントとかけ離れていてすみません。 Kosuke_Shibuyaさんが回答されている、 >>Warning: Cannot modify header information - headers already sent by (output started a > header よりも前で何かの文字列などが出力されていることによるエラーメッセージです。 これが本来のエラー原因です。 プログラムがなぜ動かなくなったか、そもそもはreadfile()の位置が悪かったのではなくて、なんらかの原因でエラーが文字出力されてしまい、それによってheader()が阻害された事です。 もう少し深く理解された方がよいかと思います。 老婆心ながらコメントさせて頂きました。
Brownie

2015/10/29 10:21

次からは、ariaki様の指摘されるような配慮を意識していきたいと思います。 ご意見ありがとうございます! また、深い理解に努めたいと思います。 今回も非常に助かりました!
guest

0

PHPで、文字列変数に入れられるのは2GB(2147483647 バイト)までです。

エラーとなるのは、この上限を超えた為だと思います。

対策:
・文字列変数に入っている文字数を監視する(文字を追加するするたびに、文字数を増やす)、
・文字数が一定の値(例えば、1.5GB)を超えたら、文字列変数をファイルに書き込み、その後で文字列変数を空に、文字列を0にそれぞれ変更する。
というようにプログラムを変更してください。

投稿2015/10/29 07:31

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Brownie

2015/10/29 08:23

回答有難うございます! 3kb 程度のファイルでエラーが起きるので、今回はおっしゃられる内容とは一致?しないようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問