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

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

ただいまの
回答率

91.10%

  • PHP

    16304questions

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

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

解決済

回答 5

投稿 編集

  • 評価 0
  • クリップ 0
  • VIEW 1,075

Brownie

score 59

現在、テキストファイルの出力に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");
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+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);

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

投稿

Kosuke_Shibuya

Kosuke_Shibuya

score 12607

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • Brownie

    Brownie

    2015/10/29 17:21

    ini_set('display_errors', 1);
    error_reporting(E_ALL);

    有難うございます。
    こちらを試してみましたが、表示されるエラーは特に変わらないようです。

    キャンセル

  • Kosuke_Shibuya

    Kosuke_Shibuya

    2015/10/29 17:22

    だとすると、BOMの可能性を疑ってください。

    キャンセル

  • Kosuke_Shibuya

    Kosuke_Shibuya

    2015/10/29 17:29


    ini_set('display_errors', 1);
    error_reporting(E_ALL);

    をかいて、header() 部分はコメントアウトしないといけませんよ。

    キャンセル

  • Brownie

    Brownie

    2015/10/29 17:34

    返信有難う御座います!
    header() 部分はコメントアウトしてみましたが、特にほかのエラーはなしです。

    少し気になったのが、readfileの部分をコメントアウトすると、エラーは出ず
    何も表示されていないテキストファイルがダウンロードされます。
    (その際、サーバ側にはきちんと書き込まれています)

    readfileの部分が疑わしく感じていますが、解決には至っていません。

    キャンセル

  • Kosuke_Shibuya

    Kosuke_Shibuya

    2015/10/29 17:41

    > 少し気になったのが、readfileの部分をコメントアウトすると、エラーは出ず
    > 何も表示されていないテキストファイルがダウンロードされます。

    readfile が何をする関数かをお分かりではないようですが…
    質問以前に、リファレンスくらいは読んでください。

    キャンセル

+1

こんにちわ。

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

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

投稿

srsnsts

srsnsts

score 151

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • Brownie

    Brownie

    2015/10/29 17:22

    有難うございます。勉強になります。
    今後気を付けます!

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

    このように変更致しました。 $file_name ←path含む
    しかし、エラーの解決には至りませんでした。

    キャンセル

+1

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

header関数を呼び出す前にechoprintvar_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:3in /tmp/test.php on line 5

Warning: Cannot modify header information - headers already sent by (output started at /tmp/test.php:3in /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

投稿

KiyoshiMotoki

KiyoshiMotoki

score 4625

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • KiyoshiMotoki

    KiyoshiMotoki

    2015/10/29 17:49

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

    キャンセル

  • Brownie

    Brownie

    2015/10/30 09:30

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

    キャンセル

0

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

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

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



投稿

coco_bauer

coco_bauer

score 2870

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • Brownie

    Brownie

    2015/10/29 17:23

    回答有難うございます!

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

    キャンセル

check解決した方法

-1


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

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

投稿

Brownie

Brownie

score 59

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • ariaki

    ariaki

    2015/10/29 18:38

    自己レスをベストアンサーにすると他の方から頂いた回答でどれが参考になったかわからないので、次回から一番参考になった回答をベストアンサーにされる方がよいですよ。
    # 本来のコメントとかけ離れていてすみません。

    Kosuke_Shibuyaさんが回答されている、
    >>Warning: Cannot modify header information - headers already sent by (output started a
    > header よりも前で何かの文字列などが出力されていることによるエラーメッセージです。
    これが本来のエラー原因です。
    プログラムがなぜ動かなくなったか、そもそもはreadfile()の位置が悪かったのではなくて、なんらかの原因でエラーが文字出力されてしまい、それによってheader()が阻害された事です。
    もう少し深く理解された方がよいかと思います。

    老婆心ながらコメントさせて頂きました。

    キャンセル

  • Brownie

    Brownie

    2015/10/29 19:21

    次からは、ariaki様の指摘されるような配慮を意識していきたいと思います。
    ご意見ありがとうございます!

    また、深い理解に努めたいと思います。
    今回も非常に助かりました!

    キャンセル

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

ただいまの回答率

91.10%

関連した質問

同じタグがついた質問を見る

  • PHP

    16304questions

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

SNSアカウントでログイン

  • Facebookでログイン
  • Twitterでログイン
  • Googleでログイン
  • Githubでログイン
  • Hatenaでログイン

teratailアカウントでログイン

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る