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/29 12:14:33
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:bonlife No.1

回答回数421ベストアンサー獲得回数75

ポイント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

回答回数34ベストアンサー獲得回数2

ポイント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

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

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

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

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

回答リクエストを送信したユーザーはいません