人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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秒ぐらいなので、タイムアウトではないと思うのですが。
原因は何でしょうか。よろしくお願いいたします。

●質問者: kurokumi
●カテゴリ:インターネット ウェブ制作
✍キーワード:echo FP Out PHP Write
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ●
●40ポイント

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

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

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

参考になれば幸いです。

◎質問者からの返答

ありがとうございます。

設定を変えてみました。

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

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

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


2 ● heroheropon
●30ポイント

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 関数で作成して、ファイルに書き出

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ