超使える!EC-CUBEのAPI機能のモジュールが無料で公開されてました!
久しぶりのブログです。
気付いたら全開前回の記事から数ヶ月経ってしまっていました。
先日EC-CUBEのクラウドサーバがファーストサーバさんからリリースされ、色々な特典が付いている事もあって盛り上がっている様です。
その中でもfacebook連携機能と言うのが特に良い感じです。
どんな機能なのかな?と内容を見てみると、EC-CUBEにAPIモジュールをインストールし、facebookのアプリからそのAPIをたたくという物でした。
無料で公開中!
で、このAPIモジュール、株式会社ドリームブリッジさんという会社が開発されたのですが無料で公開されているんです!
EC-CUBE商品検索APIモジュール
しかも2.4系用と2.11系用両方あります!
いやー、素晴らしすぎます。
しかもxmlやjsonやphpのシリアライズ値とか色んな出力形式に対応しています。
元々、僕もEC-CUBEにはAPIが必要だと思って色々実装の仕様を検討していました。色々参考になる仕様があって、どの仕様に合わせようかと思っていて手が止まっていたんですが、ついに出ました!
EC-CUBE 2.11系で変わった事 -商品一覧の取得方法-
EC-CUBEも2.11.1がリリースされましたね。
遅ればせながら2.4系から2.11系*1で変わったところをご紹介していきたいと思います。
今回は遅いクソだと言われ続けていた商品一覧の表示処理の部分についてです。
2.4系からEC-CUBEをいじってる方はまずココで「アレ?」ってなるのではないでしょうか?
1回の表示でSQLを2回発行する様になった
EC-CUBEの商品情報は主に、メインの商品情報と、「規格」と呼ばれるサイズや色違いの商品情報を取得している商品から構成されています。
そこにカテゴリ情報なんかが結合されて商品一覧を表示しているのですが、MySQLではサブクエリからのSELECTでインデックスが利用されないなど、複数のテーブルを複雑に結合している為にパフォーマンスはかなり犠牲にされていました。
特にMySQLで動かした場合は規格を増やすと最悪サイトが止まるレベルの重さでした。
コアの開発者の大河内さんはこの部分にも非常に心を痛めており、「次のバージョンでは絶対に改善させる!」と考えていた様です。
2.11.0で新しく追加されたSC_Product
EC-CUBEの2.11では2.4系には無かったSC_Productというクラスが新たに追加されました。
MVCで言うと「Productモデル」の様な物で、商品の表示関連の処理はここに書かれています。
2.11系ではデータベースでviewを使わない様に変更されています。
なので商品一覧を取得する際は、まず検索条件とソート順で表示する分だけの商品IDを取得し、その後でその商品IDから一覧で表示する情報を取得する様になっています。*2
僕も最初見た時は
「何で2回に分けてるんだ?」
と思いましたが、理由を聞いたところこの方法がPostgreSQL、MySQL共に一番早かった様です。
なので、もし商品一覧で表示する項目や並び順をカスタマイズされたいのであれば、一度このクラスの動きを追っておく事をオススメします。
EC-CUBE2.4.4以前のバージョンに存在するクロスサイトリクエストフォージェリの脆弱性への対応
2011年5月10日、JVNからEC-CUBEの2.4.4以前のバージョンに存在するCSRFの脆弱性に関する情報が公開されました
JVN#37878530 EC-CUBE におけるクロスサイトリクエストフォージェリの脆弱性
*1
CSRF*2とは、簡単に言うと、どんなサイトやHTMLメールからでも、ユーザの意図しない情報をターゲットのサイトに送信させて、望まない操作をさせる事が出来るという物です。*3
特にサイト管理者の方はEC-CUBEの管理画面にログインしたままの状態で、よく解らないリンクやボタンをクリックしない様にしましょう。*4
2.11.0以降のバージョンには存在しませんので、2.11.0以降を利用されている方は大丈夫です。*5
2.4系から2.11系へのデータ移行ツールもリリースされていますが、2.11系は2.4系とは大きく変わり、簡単にはバージョンアップ出来ないのも事実です。
特に多数のカスタマイズを加えていると、より作業量は増えてしまいます。
とりあえず2.4系をそのまま使って、この脆弱性に対応する為のやり方を今回はご紹介します。
*1:クリックしなくても開いただけで攻撃も可能です
*3:具体的にどんな事が出来るかは、ここで書く事は控えさせて頂きます。
*4:管理画面にログインしている時は、ブラウザで他のウィンドウやタブを開かない様にして、コマメにログアウトすれば平気です。
*5:2.11の開発中にこの辺の話や作業をしました。
concrete5 の簡単なテーマの作り方
僕が日本語化に参加している、直感的CMS、concrete5の簡単なテーマの作り方をFacebookに書いたので、こっちにも書いておきます。
- 適当にHTML+CSSでページを作る。
- HTMLファイルのファイル名をdefault.phpに変える。
- DTD宣言の前に魔法の呪文1を追記する。
<?php defined('C5_EXECUTE') or die(_("Access Denied.")); ?>
- の最後に魔法の呪文2を追記する。
<?php Loader::element('header_required'); ?>
- ブロックを置きたいところに魔法の呪文3を追記する。
<?php $a = new Area('[area name]');//好きなエリア名を入れる、大体Side barとMain $a->display($c); ?>
- 直前に魔法の呪文4を追記する。
<?php Loader::element('footer_required'); ?>
- CSSの名前をmain.cssに変える
- typography.cssというファイルを作る
超省略して書くと、こんな感じです。
画像とかを使いたい場合は、
<?php echo $this->getThemePath() ?>
で、インストールしたテーマのパスが取得出来るので、
<img src="<?php echo $this->getThemePath() ?>/images/sample.jpg" alt="サンプル" />
とか書けば表示されます。
CSSに書く時は、
div.sample{background:url(images/sample.jpg);}
で、[インストールしたテーマのディレクトリ]/images/sample.jpgを参照してくれます。
尚、サンプルのテーマファイルは下記からダウンロード出来ます。
http://www.xross-cube.com/index.php/tools/required/files/download?fID=295
イイ感じのテーマが出来たら、是非公式サイトのフォーラムで教えてください。
EC-CUBEのゴールドパートナーになりました!
4月1日にEC-CUBEの開発元の株式会社ロックオンより、今回更新されたEC-CUBE公式インテグレートパートナーランクが発表され、私たちXROSS CUBEは、フリーランスとしては唯一、ゴールドランクのパートナーに認定されました。
http://www.ec-cube.net/integrate/partner/partner.php?partner_id=305
このEC-CUEBのインテグレートパートナーは上から、プラチナ、ゴールド、シルバー、ブロンズ、ノーマル、プレ、と5段階あり、ゴールドランクは上位7%になります。
ランクは、構築実績、コミュニティでの活動、EC-CUBE本体のコードへのコミット等で決定されます。
以前は、各ランクの認定基準があいまいだったのですが、今回から各活動を数値化し、明確な基準に基づいたランク制度になりました。このため、今までよりもより正確にその制作パートナーの力量等が解る様になっています。(詳細はこちら)
こういった明確な基準になってランクが上がった事はとても嬉しい事なのですが、その反面、気を抜いているとすぐランクが下がってしまいます。
クロスキューブはゴールドランクになれたのですが、ギリギリなのでこれからも頑張っていきたいと思います。
東北地方太平洋沖地震用のEC-CUBEのポイント寄付ブロックを作成しました。
2011年3月11日、東北地方でM8.9、最大震度7の大地震が発生しました。
私たちは何か出来る事が無いかを考え、EC-CUBEのコアコミッターの大河内氏と共に、EC-CUBEで構築されたサイトで、会員が保有するポイントを寄付出来るブロックを作成しました。
EC-CUBEでショップを運営されているショップオーナーの皆様、これ使って是非ご協力をお願いします。
ショップオーナー様で、会員のポイント分の金額を寄付しても良いという方は無償にてご利用頂けます。
2011-3-12 18:37 追記:
EC-CUBEコアコミッターの大河内様が管理機能を追加してくれました。ご利用される場合は、上記の「寄付ポイント管理アドオン」をダウンロードしてください。
EC-CUBE クラウドサーバを試してみた。速い!
前回のブログから気づけば1ヶ月以上も経ってしまいました。
なかなか継続して書くのは難しいですね...
最近の案件で、サーバ選定からするケースがあったので、ちょうどリリースされたばかりのEC-CUBEクラウドサーバを試してみました。
EC-CUBE公式のクラウド環境という事で、その実力が気になっていました。特に、EC-CUBEの弱点とされるパフォーマンスが気になって夜も眠れませんでした。
EC-CUBEクラウドサーバはファーストサーバさんが実際の環境を構築して運営されています。
サーバのOSはLinuxだそうで、聞いた話ではカーネルレベルでEC-CUEB用にカスタマイズしたそうです。いったいどんな事をしたんでしょうね。
ロックオンさんからファーストサーバさんのご担当者*1をご紹介頂き、検証用の環境を準備して頂けないか聞いてみました。
「ちょっとまだリリース前なので... 相談してみます」
との事だったのですが、もうその日の内に検証用の環境を準備して頂きました!
正直、いままでファーストサーバさんのサーバ(共有)は制約が多く、使いにくくてあまり好きではありませんでした。
しかしこの素早いご対応!ちょっと好きになりました。
準備して頂いたのは、一番安いプランの「ファースト」(月額1,785円)です。
管理画面は普通のファーストサーバ
サーバの管理画面は他のプランと同じ見慣れた管理画面です。
なので、「サーバの事はよくわからない」という方でも簡単に設定出来ます。
EC-CUBEがインストールされた状態で環境が準備されるので、インストールでつまづく事もありません。
早速検証。1,000点商品を登録してみました。
例の商品情報生成スクリプトでサクッと生成しました。
- 商品点数1,000点
- カテゴリ
- 大カテゴリ10個
- 中カテゴリ4個
- 小カテゴリ3個
- 規格 1も2も3個づつ
- 規格分類は100個
Apache benchをかけてみます。
とりあえず軽いのから
表示画面 | 全商品一覧 |
コネクト数 | 10 |
リクエスト数 | 50 |
*1:舟木様、非常に素早いご対応ありがとうございました。
concrete5が重くなってきたら古いバージョンを消そう。
concrete5のちょっとしたTips。
concrete5はページを更新する度にその履歴が「バージョン」として残っていきます。
間違えちゃったり、以前の状況を確認したい時なんかに便利なのですが、この履歴データのせいで、しばらく運用しているとデータベースが肥大化していきます。
特にCollectionVersionBlocksとかすごいレコード数になったりします。
なので、
「あれ?最近なんか重くなってきたなー」
と思ったら古いバージョンを消しましょう。データベースからもレコードが消えてデータベースが軽くなります。
消し方は、
これで古い履歴が全部消えます。ついでにデータベースを最適化しておいた方が良いでしょう。
!注意!戻せませんので必ずバックアップを取ってから作業しましょう。
管理画面からデータベースのバックアップが取れます。必ずバックアップを取ってから作業しましょう。
大量のページがあるサイトではかなり面倒
このやり方では1ページづつしか古いバージョンを消せません。
なので大量にページがあると厄介です。
自分でも欲しいので、近い内に全ページの古いバージョンを消すアドオンでも作ろうと思ってます。
もし、「待てないー!」という方はご自分でチャレンジされても良いかもしれません。
/concrete/models/collection_version.phpのCollectionVersion::delete()に実際の処理が書いてあります。
EC-CUBEをチューニング - MySQL:MySQLでもviewを使って8倍速にするカスタマイズ!!
こちらは2.4系の記事になります。3系でのチューニングの記事はコチラ
さて、だいぶ間が開いてしまいましたが、前回の続きで、EC-CUBEをMySQLで動かす際のチューニングの続きです。僕がやった施策の中ではこれが劇的に効果がありました。
今回は、MySQLでもviewを使うという物です。
データベースのviewとは、簡単い言うとSELECT文の結果をテーブルの様に扱える機能という事です。
EC-CUBEは、PostgreSQLで動かす場合は、商品情報のカテゴリや規格の情報をまとめた物をviewにして、商品一覧画面や商品詳細画面等で利用しています。
ところが、EC-CUBEをMySQLで動かす場合、MySQLのバージョンが4.1でも利用出来る様に作られているため、viewの部分をサブクエリにして動かしています。
この、ネストしたサブクエリからSELECTする場合、インデックスが使えないので、こんなに遅くなっていて、インデックス張っても意味が無い訳です。
バージョン5.0からはMySQLでもviewが使える様になっています。最近のレンタルサーバであれば5.0以上を導入しているところも多いので、バージョン5.0以上なら導入可能です。
8.25倍速くなった!
結果から言うと、/products/list.php*1 が8.25倍速くなりました!
実はちょこちょこ問題もあるので、微修正は必要ですが、そんな事も苦にならないくらいの激速っぷりです!!
体感的にも劇的な改善です。
一応ちょっと負荷を上げた状態でのabテストの結果も貼っておきます。
Document Path: /eccube244/html/products/list.php
Document Length: 90587 bytesConcurrency Level: 5
Time taken for tests: 13.157 seconds
Complete requests: 10
Failed requests: 0
Write errors: 0
Total transferred: 909540 bytes
HTML transferred: 905870 bytes
Requests per second: 0.76 [#/sec] (mean)
Time per request: 6578.478 [ms] (mean)
Time per request: 1315.696 [ms] (mean, across all concurrent requests)
Transfer rate: 67.51 [Kbytes/sec] receivedConnection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 0.9 2 2
Processing: 1728 5980 3188.8 5578 13155
Waiting: 1323 4816 3472.3 4640 13145
Total: 1728 5981 3189.5 5580 13157
WARNING: The median and mean for the initial connection time are not within a normal deviation
These results are probably not that reliable.Percentage of the requests served within a certain time (ms)
50% 5580
66% 7296
75% 7300
80% 7530
90% 13157
95% 13157
98% 13157
99% 13157
100% 13157 (longest request)
で、実際にどうするかですが、ここからはクロスキューブからクリスマスプレゼントです。
*1:全件一覧表示
EC-CUBEをチューニング - MySQL:テーブル設計 - カラムの型
EC-CUBEの新バージョン、2.5.0の開発が開発合宿でかなり進んだ様です。僕も参加したかったのですが、諸事情により参加出来ませんでした。*1
EC-CUBE2.5.0では、MySQLへの対応がかなり改善されていて、パフォーマンスもかなり向上しているとの事です。
いやー、楽しみですね。
しかし、現在EC-CUBEでECサイトを運営されている方は、MySQLへの対応が不完全なバージョンを利用しており、2.5.0がリリースされるまでは2.4.4以下のバージョンを使い続けなければいけません。
また、仮に2.5.0がリリースされたとしても、バージョンアップ作業は大変でしょうし、すぐバージョンアップは出来ないと思います。*2
そこで、このEC-CUBEをチューニング - MySQL編もまだ需要があると思いますので、続きを書いてみます。
前回のEC-CUBEをチューニング - MySQL:準備編で、EC-CUBEに大量の商品データを登録するところまでやりました。
今回は、テーブルの構造を出来るだけ変えずにパフォーマンスをアップさせる方法です。
レンタルサーバ等ではMySQLのパラメータの設定を変更出来ない環境も多いと思うので、テーブルやカラムの設定変更だけで出来るだけパフォーマンスを上げます。
前回準備した環境では遅過ぎて作業に支障が出るので、VM上に再度環境を構築しました。
PHP 5.2.13
MySQL 5.1.39
- 大カテゴリ
- 5
- 中カテゴリ
- 4
- 小カテゴリ
- 4
- 規格1
- 5
- 規格2
- 5
- 商品数
- 1000
標準の状態では全商品一覧の表示に13960msもかかってしまいました。遅いですねー
カラムの型を変更する。
EC-CUBEでは、テキストデータが入るカラムがtext型になっています。*3
しかしMySQLではtext型が設定されているカラムはインデックスに指定出来ませんし、min()等の関数で処理する際もかなり遅くなってしまいます。
なので、
をchar型に変えてしまいます。
結果は10843msになりました。ちょっと速くなりましたね。
「おいおい、チューニングで大切なインデックスは?」
とツッコミたくなる方もいらっしゃると思いますが、EC-CUBEをMySQLで動かす場合、PostgreSQLで動かす時のviewをサブクエリをガンガン ネストして表現しているので、あんまり意味がありません。
むしろ遅くなる事の方が多い様です。
次回は、もう少し踏込んで、テーブルを変えずにもっと劇的に変わる方法をご紹介します。