[PHP-users 30268] Re: PHPプログラムとサーバー負荷の関係

goungoun gounx2 @ gmail.com
2006年 9月 6日 (水) 15:55:27 JST


こんにちは

> と言う作業をさせているだけなのですが、それでも実行させると
> サーバーの他の動作が非常に重たくなってしまいます。

> 
> ただデーターの件数が非常に多い(odbc_num_rowsで確認したと 
> ころ、21万件程度あります。)
> のでやはり今のサーバーのスペックでは厳しいのでしょうか?
> 

どんな些細な処理でも21万回もやれば、それなりに
大きな負荷になると思います。

# もっとも21万回をどうとらえるかは、
# 人によって違うとは思いますが。
# 個人的に*21万回も!*と感じたということです。


> 果たしてこれは私のコードが原因なのか、

どのコードがどの程度の負荷になっているのか、
計測してみました?
正確に時間を測らないまでも、1行コメントにしたり
で実行すれば、なーんとなくどの処理が重いのか
見えてくると思います。

あと、
SQLを生で実行してみました?
当然ですが、仮に10秒かかるクエリーであるなら、
いくらPHPでがんばっても10秒より早くは
実行できませんから、SQLをどうするかが課題になると思います。

> $sql = "SELECT メールアドレス FROM MAIL_LIST ORDER BY メー 
> ルアドレス";
> $sql = mb_convert_encoding($sql, 	"Shift_JIS");
> $result = odbc_exec($con, $sql) or die("Error!" .  mb_convert_encoding 
> (odbc_error(), "EUC-JP"));
> echo "送信予定件数は[" . odbc_num_rows($result) . "]件で 
> す。<br />\n";

件数取得するだけならCOUNT(*)すればよいような。

# odbc_exec()の動きを知らないので、はずしてるかもしれませんが、
# 内部的に、先にDBサーバからクエリー結果を全てPHP側に渡すような
# 処理になってるかもしれませんし、であれば件数取得したいだけ
# なのに21万件のデータがPHPに渡ってきてることになりますよ。

あと、そもそも論として、これを解決したところで

> $cust_add = $row["$test"];
> /* 本来ならばここにメールを送るコードが入ります */
> echo $cust_add . "にメールが送信されました!<br />\n";

現状、負荷がかかりそうな処理であるメール送信するコードが抜けてる
わけですから、現行のやり方で満足できる結果(例えば
処理時間であったり)が出るのか分からないと思います。

とりあえず、DBの内容を100件ぐらいにして
やるべき処理を全部書いてみて、
個々の小さな処理単位でどの程度の時間がかかるのか計測して、
本来の件数実行した場合の予測処理時間出して、
その上で、今のサーバでよいのか?とか
現行の設計でよいのか?とか
考えたほうが後戻りがないと思います。


ps.
現状、うかがい知れないことですが、
まとめて送るんだったらBccにメアド並べたほうが
いいんじゃない?とか・・・
ざっくりと考えて、
1秒に1通として、60時間近く
10通でも6時間近く
1秒に60通送れれば、1時間切るかな
と考え出すと、Webから1時間の処理を実行?
排他制御しておかないと、終わらないうちに
また実行かけられるとシステム止まるな。とか、
だったらWebでなくバッチでもいいんじゃない?とか、
これはもう完全に本題とははずれますが、
エラーメールたくさん返ってきそうとか。


-- 
goungoun <gounx2 @ gmail.com>
http://goungoun.dip.jp/app/



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