アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

ECオープンソースのEC CUBEを調査してみました

こんばんは、笹亀です。

最近、非常にECサイトの構築する機会が多くなり、
導入コストの節減や便利なフリーなものがないかと調査をしていました。
そこで発見したのが、今回の調査対象となった「EC CUBE」です。
http://www.ec-cube.net/



まずはEC CUBEとはどうゆう機能があるのかを解説したいと思います。
EC CUBEは機能の豊富さにおどろきました。
当たり前ですが、ECサイトの機能は一通りあります。
商品管理についても、カテゴリ管理、並び替え機能、レビュー機能トラックバック機能などがあります。
その他にも受注管理、売上集計など基本的なECサイトを運営するにあたって必要なものはそろっております。
コンテンツの管理としても、メルマガを送信する機能やおすすめ商品機能やキャンペーン機能なども用意されています。
ユーザ側の機能としてもPC版だけでなく、モバイル版も準備してある部分はすばらしいと思いました。
ページデザインを管理する機能も用意されており、配置だけであればある程度自由に変更できるのも魅力です。


ただ、新しいページの追加や商品一覧、詳細などのページを修正するには、PHPのテンプレート(Smarty)をそのまま編集するので、編集にはそれなりのSmartyの知識がないと大きな編集は難しいと思います。


EC CUBEでは、PC側のデザインテンプレートの販売がされており、下記URLよりサイトのデザインを選び、購入して管理画面で簡単にデザインの差し替えができることもできます。
http://store.ec-cube.net/products/list.php?category_id=12

EC CUBEはECサイトを運営するには十分な機能がそろっています。

次にエンジニア視点で調査してみたいと思います。
やはりエンジニアならばオープンソースの利点である、スクリプトを自由に変更ができる点を生かさないといけません。さっそくPHPスクリプトでどのように作成されているかを調査してみたいと思います。
プログラムを解凍して、スクリプトの構造を確認してみると「data」フォルダと「web」フォルダで構成されております。webフォルダはブラウザから実行されるPHPスクリプトや画像ファイルなどが格納されていました。dataフォルダにはページを構成するクラスファイルやSmarty,PDFなどのライブラリが格納されています。

 ※Eclipseでスミマセン

次にスクリプトの編集方法を解説したいとおもいます。
スクリプトは1つの実行ファイルと2つクラスファイルとテンプレートで構成されています。
商品一覧の処理を例に解説します。
Webから実行されるファイルは「/web/products/list.php」に格納されています。
アクション部分(処理)は、「/data/class/pages/products/LC_Page_Products_List.php」に格納されています。
Smartyのテンプレートファイルは、「/data/Smarty/templates/products/list.tpl」に格納されています。

アクション部分のカスタマイズを行うときは、アクションファイルと継承関係にあるファイル(/data/class_extends/pages_extends/products/LC_Page_Products_List_Ex.php)にメソッドをコピーして処理を変更することができます。処理のカスタマイズを行うときには継承関係にあるファイルにコピーして変更するのが好ましいです。他のファイルについても同じような構成になっており、比較的簡単にカスタマイズが可能だと思います。

最後にパフォーマンスについて調査しました。
高機能なところが原因でパフォーマンスは非常に悪いです。
商品数で言うと約500件くらいで処理が重くなるのではないでしょうか。
私の場合は、2000件程のデータを投稿して試しましたが、
PCのスペックがあまりよくはないですが、商品一覧を表示するのに約11秒かかりました。
EC CUBEのコミュニティサイトなどを見ていても同じようなことが記述されていました。

「/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php」内に記述されている、「viewToSubQuery」メソッドのSQLを修正することで、ある程度は改善されます。
しかし、多重のテーブル間のJOINとサブクエリーを使って商品を取得しており、テーブルのindexなどを設定しても、問題解決しませんでした。テーブルの設計を見ると、JOINでデータを持ってこないと取得できず、設計時点の問題ではないかと感じました。

解決策としては、1つの商品に規格という概念で同じ商品での規格を作成することができるこの機能を廃止することです。
規格の機能を廃止し、1商品を1つしか表すことができないようにしてしまうことです。
それにはdtb_productsテーブルに規格取得時に必要なフィールドを持たすことにより解決は可能です。規格以外にもカテゴリやdtb_products_classの情報もdtb_productsテーブルに1つにまとめるとさらに効果が高まります。

言葉では記述するのは簡単ですが、スクリプトの修正はものすごく手間がかかりました。
私はトリガーの機能を利用してそれらの対象となるテーブルが更新されるとdtb_productsテーブルに追加したフィールドを更新するように設定しました。あとはSQL文を発行している箇所などを修正することにより、パフォーマンスが出るようになりました。

個人の感想としては、小規模のECサイトとして使用する場合には非常に満足して使用ができるものだと思います。しかし商品数が多いECサイトとして利用する場合には大きな改修をして使用することになりそうです。
オープンソースで利用できることからあまり贅沢はいえませんが、商品数が多くても利用できるようになっているとさらに大きなニーズに答えられるシステムとしてもおすすめできるものだと感じました。

他にもいろいろなオープンソースで提供されているアプリがあると思いますが、「これは使える!」というものを私にも教えていただけたらとてもうれしいです^^