[PHP-users 33093] Re: 大量のCSV書き出し時にapacheのCPU使用率が高まる

KousukeEbihara kousuke @ co3k.org
2008年 1月 13日 (日) 10:34:53 JST


海老原です。

単純にサーバ側のCPU使用率を下げるということであれば、 sleep() や usleep
() をループの最後などに挟むのが手っ取り早いと思います。
あとはいちいち変数に代入せず(=メモリ内に保持せず)、ループの中で出力し
てしまうとかでも違ってくるかもしれません。

とはいえ、やはりテンポラリファイルを作成して、それをダウンロードさせると
いう形に変更するほうが適切だとは思います。
サーバの環境にも左右されるので一概には言えませんが、リクエストがある毎に
一回一回DBの結果をCSV形式にして出力、ということだと、たとえば同一のデー
タを連続で出力する必要があった場合、その都度同じようにDBに問い合わせて同
じ結果をCSV形式にして……という処理を繰り返す必要があり、冗長です。
これをファイルにしておけば、やり方次第では使い回すことができます。

ただ、もしMySQLのデータを単純にCSVにしたいということであれば、以下のよう
なSQL文を叩いて出力することもできます(反則でしょうか……(^^;))

mysql> SELECT * FROM table INTO OUTFILE "/tmp/table.csv" FIELDS 
TERMINATED BY "," OPTIONALLY ENCLOSED BY "\"";

正直パフォーマンス周りについてはちょっと自信がないのですが、以上の解決策
を試していただければと思います。

>こんにちは。私、大河原と申します。
>
>apache+php+mysqでwebアプリケーションを作成及び導入しているのですが、
>[大量のCSV書き出し時にapacheのCPU使用率が高まる]
>という現象が発生しております。
>詳しい状況は下記の通りです。
>
>■環境
>apache 2.0.59
>php 5.2.5
>mysql  5.1
>サーバOS:windows server 2003
>サーバCPU:Xeon 1.86 GHZ *2
>サーバメモリ:3G
>
>■apacheのCPU使用率
>約5秒間、50%になる
>*複数ユーザが処理を実施すると100%近いCPU使用率になる
>
>■書き出し件数
>4000件
>
>■書き出し列
>33列
>
>■書き出し後のファイルサイズ
>約2M
>
>■プログラムの概要
>//sqlの結果4000件33フィールドをループ
>
>	//csv書き出し用に4000件33フィールドを変数に設定
>
>//sqlの結果4000件をループ終わり
>
>//HTMLヘッダーを定義
>header("Content-type:application/ocean-stream;charset=Shift-JIS");
>header("Content-Disposition:{$Disp};filename={$FileName}");
>
>//CSV書き出し用変数をecho
>
>//ファイルのダウンロード
>
>■想定される解決策
>・結果1行毎にfputsした方がapacheの使用率が軽減する?
>
>
>良い解決を策をご存じの方がいらっしゃったら、ご教授頂けないでしょうか。
>何卒、よろしくお願い致します。
>
>--------------------------------------------
>大河原 麗偉
>--------------------------------------------
>
>
>
>_______________________________________________
>PHP-users mailing list  PHP-users @ php.gr.jp
>http://ml.php.gr.jp/mailman/listinfo/php-users
>PHP初心者のためのページ - 質問する前にはこちらをお読みください
>http://oldwww.php.gr.jp/php/novice.php3
>
>__________ NOD32 2085 (20070228) 情報 __________
>
>このメールはNOD32によって検査済みです。
>http://canon-sol.jp



PHP-users メーリングリストの案内