PHPでファイルを出力する際、約30MBぐらい出力したところでスクリプトが停止してしまいます。

処理は単純で、120,000回ぐらいのループの中でfwrite()しています。
ループは以下のような感じです。

while ($ary = $conn->fetch_assoc()) {
  $out = '';
  $out .= $ary['a'];
  $out .= $ary['b'];//このラインをコメントアウトするなど、出力を減らすと問題が起きません
  //各ループ時、この$outは実際は計300Bぐらいの文字データが入ります
  if(fwrite($fp, $out) === FALSE) {
    echo '<div> Can not write file !</div>';
  }
}
一番のミソは、$outに入れるデータを減らすと、ちゃんと最後まで処理されることです。
出力ファイルを見ると、出力ライン数が毎回変わります。ブラウザのレスポンスは最後の「</html>」まで出力されません。
処理時間は10秒ぐらいなので、タイムアウトではないと思うのですが。
原因は何でしょうか。よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:2006/11/28 17:56:44
  • 終了:2006/11/29 12:14:33

回答(2件)

id:bonlife No.1

回答回数421ベストアンサー獲得回数752006/11/28 18:32:52

ポイント40pt

ワーニングやエラーメッセージは何も出ていませんか。

max_execution_time(実行時間の上限)かmemory_limit(使用メモリサイズ上限)のどちらかが問題になっている可能性が高いと思います。

php.iniの内容を変更するか、スクリプト内でini_set関数で変更してみてはいかがでしょうか。

参考になれば幸いです。

id:kurokumi

ありがとうございます。

設定を変えてみました。

10秒ぐらいの処理と申したのは、実は出力を減らした場合の時間でした(すみません)。

max_execution_timeをデフォルト値から60に変えたら無事に処理できました。

どうもありがとうございました。

2006/11/29 12:06:15
id:heroheropon No.2

heroheropon回答回数34ベストアンサー獲得回数22006/11/28 19:21:57

ポイント30pt

PHPのメモリー上限設定を超えているのではないでしょうか?

通常、php.ini の中に

memory_limit = 8M ; Maximum amount of memory a script may consume (8MB)

のように指定されています。私のお遊び用サーバLinuxではデフォルトでは上記の通り8MBでした。

(php.ini の場所がわからないときは whereis php.ini とすれば出てきます)

しかし、メモリ上に30MBものエリアを確保するプログラムというのはあまり構造上よろしくないかもしれませんね(^^; できれば一時ファイルを tempnam 関数で作成して、ファイルに書き出すほうがよいかもしれません。

ご参考になれば。

id:kurokumi

ありがとうございます。

memory_limitを確認してみたところ、32Mとなっていました。

> 一時ファイルを tempnam 関数で作成して、ファイルに書き出

是非、検討させてもらいたいと思います。

ありがとうございました。

2006/11/29 12:12:26

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません