処理は単純で、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秒ぐらいなので、タイムアウトではないと思うのですが。
原因は何でしょうか。よろしくお願いいたします。
ワーニングやエラーメッセージは何も出ていませんか。
max_execution_time(実行時間の上限)かmemory_limit(使用メモリサイズ上限)のどちらかが問題になっている可能性が高いと思います。
php.iniの内容を変更するか、スクリプト内でini_set関数で変更してみてはいかがでしょうか。
参考になれば幸いです。
PHPのメモリー上限設定を超えているのではないでしょうか?
通常、php.ini の中に
memory_limit = 8M ; Maximum amount of memory a script may consume (8MB)
のように指定されています。私のお遊び用サーバLinuxではデフォルトでは上記の通り8MBでした。
(php.ini の場所がわからないときは whereis php.ini とすれば出てきます)
しかし、メモリ上に30MBものエリアを確保するプログラムというのはあまり構造上よろしくないかもしれませんね(^^; できれば一時ファイルを tempnam 関数で作成して、ファイルに書き出すほうがよいかもしれません。
ご参考になれば。
ありがとうございます。
memory_limitを確認してみたところ、32Mとなっていました。
> 一時ファイルを tempnam 関数で作成して、ファイルに書き出
是非、検討させてもらいたいと思います。
ありがとうございました。
ありがとうございます。
設定を変えてみました。
10秒ぐらいの処理と申したのは、実は出力を減らした場合の時間でした(すみません)。
max_execution_timeをデフォルト値から60に変えたら無事に処理できました。
どうもありがとうございました。