※この記事はEC-CUBE2.4系を想定しております。


EC-CUBEでは標準でメール配信機能が付いています。


利用方法としては、簡単にですが下記になります。

A.配信顧客の条件を作成

  ↓

B.配信内容を作成

  ↓

C.配信開始



配信が始まると下記のような処理を行います。

1.送信対象を抽出

  ↓

2.送信内容を抽出

  ↓

---対象がなくなるまで-----

3.件名/文章の作成(差し込みはid/nameのみ)

  ↓

4.メール配信

  ↓

5.送信件数をdtb_send_historyに更新

  ↓

6.dtb_send_customerに送信履歴を更新

-----ここまでの処理を繰り返す-----

  ↓

7.終了をDBに書き込み

  ↓

8.完了メールを管理者に送信



※以下のファイルを参考

/data/class/pages/admin/mail/LC_Page_Admin_Mail_Sendmail.php




一部テーブル名を書いてますが、ここが大事です!


結論から言いますと、下記カラムにINDEXを貼る事により、早くなります。


dtb_send_history.send_id

dtb_send_customer.send_id + dtb_send_customer.customer_id


理由はですが、


EC-CUBEのテーブル構成は、必要箇所以外はインデックスが貼られていません。

(2.4系では)


で、問題となるのが4.5.の処理です。


通常1秒以内にSQLの処理が完了すれば、体感速度的には遅いとは感じないと思われます。


ただし、それが100回くらいの実行になると話が変わってきます。


0.8秒を100回=80秒

0.01秒を100回=1秒


と、1分以上かかるか、1秒で終わるかと雲泥の差です。


インデックス未設定の場合、数百万レコードある、dtb_send_customerに対して5の処理を1回だけ実行した場合ですが、1秒程かかります。



これがインデックス設定後には、10ミリ秒以下まで早くなりました。



もし、少しでも早くしたい、と思ってる方は試してみて下さい。


・・・ちなみにデメリットもあります。


送信対象リストを作成する場合に(上記ですとB.にあたります。)に設定前より時間がかかってしまうことです。


といっても、30分も1時間も関わる訳ではないので、私の場合は、結果全体的に早くなりました。



・・・です。


ちなみに最初はMTA自体の変更まで考えました。。。まさかDB側がボトルネックになっていたとはです。



オープンソースECサイト構築ソフトEC‐CUBE(Ver2.4.0対応)公式ガイドブック カス.../オレンジ 岸本
¥2,835
Amazon.co.jp

PerlをCGIで実行した際に、下記が出る事があるかと思います。


CGI 実行エラーです
500 : Internal Server Error





これは、「エラーがでたよ」と教えてくれてるだけで、具体的な話はなーんも言ってません。


具体的な内容は、基本エラーログに出力されます。


共用サーバの場合は。。。見れない場合もありますが。。。


設定を変更していなければ下記ファイル名で、どっかに出力されてます。


error_log


パスは下記あたりですかね?


/var/log/httpd/error_log



エラーが発生する原因は以下多いようです。


・実行権限が付与されていない(755 とか 700 とかを設定)

・そもそも文法に間違えあり

・改行コードがLFになっていない

・cgi-binディレクトリ以下でしか実行できない


等ですかね。



あと特殊なケースとして、suExecによる制限に引っ掛かる時ですかね。


これはCGIを実行するユーザを指定するApacheのモジュールです。


これが設定されていると、ファイル、及び設置してあるディレクトリのユーザとグループが一致していないと、実行ができないというものです。


/etc/httpd/conf/httpd.conf や /etc/httpd/conf/ssl.conf 等のVirtualHostディレクティブに下記が、記載されています。


SuexecUserGroup apache apache

一つ目の引数apacheはユーザ名

二つ目の引数apacheはグループ名


を指定してます。


なので、下記のように変更すれば


SuexecUserGroup admin root

rootグループのadminユーザでCGIを実行する事になります。


ちなみに無効にしたい場合もあるかと思います。その時は


#SuexecUserGroup apache apache

とコメントしてしまえばOKです。


エラー解消されず、まだ試して無い方は試してみてわ。