Hatena::ブログ(Diary)

EC-CUBEのカスタマイズならクロスキューブ!サイト制作メモ このページをアンテナに追加 RSSフィード Twitter

2011-12-07

FuelPHPとCodeIgniterでCMS作ってパフォーマンスを比べてみた

FuelPHP Advent Calendar 2011 ということで、PHP フレームワーク FuelPHP に関するブログクリスマスまでお届けしています。前日の@9ensanさんの記事はFuelPHPで作るログイン管理

過去記事一覧は、FuelPHP Advent Calendar 2011

CodeIgniterという軽量で高速な非常に気に入っているPHPフレームワークがあるのですが、最近ライセンス問題が怪しいのと、バージョン2系になってから開発体制も怪しくなっていたので似た様なフレームワークを探していました。


すると、concrete5でもお世話になっている@kenji_sさんがFuelPHPをベタ褒めしていたので試してみる事にしました。

なるべく実際の環境に近い様にと超簡単なCMSを作って比べてみます。

このWebアプリがやっている事は、

  1. ページのパスからDB叩いてページID取得
  2. ページIDからそのページのコンテンツDBから取得
  3. テンプレートファイルで指定してある描画エリアキーにしてコンテンツテンプレートファイル内に描画

と言う様なconcrete5っぽい動きをしています。


時間の都合でトップページ分のデータしか登録していませんし、そもそもCMSなのにコンテンツの登録機能とか作っていません。

まあ、でもベンチには充分だと思います。

可能な限り似た様な処理になる様に同じ様にコントローラモデル、ビューファイルを作って同じ様に処理しています。

DBも同じテーブルを使っており、両方ともmysqli関数接続しています。

サーバさくらクラウドです。

使ったバージョンCodeIgniterはVer.2.1.0、FuelPHPはVer.1.1-RC1です。

ちょっとFuelPHPのDBまわりの設定で手間取りましたし、そもそもFuelPHPの正しいお作法に則って書かれているか怪しいですが、とりあえず出来ました。

で、例のごとくapacheベンチをかけて見ます。

ab -n200 -c200 http://cloud.xross-cube.net/CI/
ab -n200 -c200 http://cloud.xross-cube.net/Fuel/

ベンチ結果

で、結果は以下の通りです。

Requests per secondCodeIgniterFuelPHP
1回目42.7439.38
2回目30.5146.43
3回目17.1517.46
4回目45.0646.77
5回目44.8721.95
平均36.0634.39

結論から言うとパフォーマンスは変わらなそうな感じです。
今回の環境クラウド環境なのでどうもムラがある様です。

ちなみに、APCを有効にしてベンチかけたら下記の様な感じでした。*1

Requests per secondCodeIgniterFuelPHP
1回目126.3372.11
2回目119.9526.98
3回目37.3017.46
4回目25.9293.03
5回目119.1949.71
平均85.7451.86

ちょっとCodeIgniterの方が速いですね。

結論

FuelPHPは書き方や使い方もCodeIgniter近いですし、なによりライセンスMITでパッケージ機能があるのでかなり良い感じです。

今後も引き続き使ってみたいなーと思いました。

次は@ounziwさんの「FuelPHP の view に PHPTAL デザインテンプレートを使う」です。

*1アプリ側でキャッシュ指定とかはしていません。

2011-10-01

超使える!EC-CUBEのAPI機能のモジュールが無料で公開されてました!

f:id:xross-cube:20111001050305p:image

久しぶりのブログです。

気付いたら全開前回の記事から数ヶ月経ってしまっていました。


先日EC-CUBEクラウドサーバファーストサーバさんからリリースされ、色々な特典が付いている事もあって盛り上がっている様です。

その中でもfacebook連携機能と言うのが特に良い感じです。

どんな機能なのかな?と内容を見てみると、EC-CUBEAPIモジュールインストールし、facebookアプリからそのAPIをたたくという物でした。


無料で公開中!

で、このAPIモジュール株式会社ドリームブリッジさんという会社が開発されたのですが無料で公開されているんです!

EC-CUBE商品検索APIモジュール

しかも2.4系用と2.11系用両方あります!

いやー、素晴らしすぎます。

しかもxmljsonphpシリアライズ値とか色んな出力形式に対応しています。

元々、僕もEC-CUBEにはAPIが必要だと思って色々実装の仕様検討していました。色々参考になる仕様があって、どの仕様に合わせようかと思っていて手が止まっていたんですが、ついに出ました!


APIでどんな事ができるの?

これは凄い事なんです。

EC-CUBEの弱点として、コンテンツ作成管理機能が弱い事がありました。

しかし、このAPIを使えば、facebookwordpressconcrete5等のCMSEC-CUBEの商品情報が自動的に簡単に掲載出来るんです。

追記:試しにconcrete5で表示させてみました。 http://c542.xross-cube.net/

ひとつEC-CUBEをカートエンジンとして利用して、コンテンツを他のCMSで作って複数サイト展開とかも簡単です!

残念ながら現在は商品情報のみ

非常に素晴らしいAPIモジュールですが、現在は残念ながら商品情報にのみ対応しています。

カテゴリリストの表示やユーザー情報等には対応していません。(ログインAPIも欲しいですね)

とは言え、素晴らしい事です。

ぜひ皆さんもこのAPIモジュールを使ってEC-CUBEと色んな物を連携させてみてください。

2011-05-12

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回に分けてるんだ?」

と思いましたが、理由を聞いたところこの方法がPostgreSQLMySQL共に一番早かった様です。

なので、もし商品一覧で表示する項目や並び順をカスタマイズされたいのであれば、一度このクラスの動きを追っておく事をオススメします。

*1:何で2.4から2.11?2.5は?と思うかも知れません、当初は2.5だったんですが、「いっぱい変わったし2011年だし!」という関西ノリで2.11になりました。

*2:他にもページング用の全体件数を取得したりもしています。

2011-05-11

EC-CUBE2.4.4以前のバージョンに存在するクロスサイトリクエストフォージェリの脆弱性への対応

2011年5月10日JVNからEC-CUBEの2.4.4以前のバージョン存在するCSRF脆弱性に関する情報が公開されました
JVN#37878530 EC-CUBE におけるクロスサイトリクエストフォージェリの脆弱性

f:id:xross-cube:20110511021528p:image*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クリックしなくても開いただけで攻撃も可能です

*2クロスサイトリクエストフォージェリ

*3:具体的にどんな事が出来るかは、ここで書く事は控えさせて頂きます。

*4管理画面にログインしている時は、ブラウザで他のウィンドウやタブを開かない様にして、コマメにログアウトすれば平気です。

*5:2.11の開発中にこの辺の話や作業をしました。

2011-05-10

concrete5 の簡単なテーマの作り方

僕が日本語化に参加している、直感的CMSconcrete5の簡単なテーマの作り方をFacebookに書いたので、こっちにも書いておきます。

  1. 適当HTML+CSSでページを作る。
  2. HTMLファイルファイル名をdefault.phpに変える。
  3. DTD宣言の前に魔法呪文1を追記する。
    <?php defined('C5_EXECUTE') or die(_("Access Denied.")); ?>
    
  4. <head>の最後魔法呪文2を追記する。
    <?php Loader::element('header_required'); ?>
    
  5. ブロックを置きたいところに魔法呪文3を追記する。
    <?php
        $a = new Area('[area name]');//好きなエリア名を入れる、大体Side barとMain
        $a->display($c);
    ?>
    
  6. </body>直前に魔法呪文4を追記する。
    <?php Loader::element('footer_required'); ?>
    
  7. CSS名前をmain.cssに変える
  8. 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

イイ感じのテーマが出来たら、是非公式サイトフォーラムで教えてください。

2011-04-02

EC-CUBEのゴールドパートナーになりました!

f:id:xross-cube:20110404165655p:image

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本体のコードへのコミット等で決定されます。

以前は、各ランクの認定基準があいまいだったのですが、今回から各活動を数値化し、明確な基準に基づいたランク制度になりました。このため、今までよりもより正確にその制作パートナーの力量等が解る様になっています。(詳細はこちら

こういった明確な基準になってランクが上がった事はとても嬉しい事なのですが、その反面、気を抜いているとすぐランクが下がってしまいます。

クロスキューブはゴールドランクになれたのですが、ギリギリなのでこれからも頑張っていきたいと思います。

2011-03-12

東北地方太平洋沖地震用のEC-CUBEのポイント寄付ブロックを作成しました。

2011年3月11日東北地方でM8.9、最大震度7大地震が発生しました。

私たちは何か出来る事が無いかを考え、EC-CUBEのコアコミッターの大河内氏と共に、EC-CUBEで構築されたサイトで、会員が保有するポイント寄付出来るブロックを作成しました。

EC-CUBEショップを運営されているショップオーナーの皆様、これ使って是非ご協力をお願いします。

f:id:xross-cube:20110312185652p:image

ショップオーナー様で、会員のポイント分の金額を寄付しても良いという方は無償にてご利用頂けます。

2011-3-12 18:37 追記:

EC-CUBEコアコミッターの大河内様が管理機能を追加してくれました。ご利用される場合は、上記の「寄付ポイント管理アドオン」をダウンロードしてください。

使用方法

    1. /html/frontparts/bloc/ に解凍したファイル(send_point.php)をアップロードします。
    2. アップロード後、[ショップアドレス]/frontparts/bloc/send_point.phpアクセスするとブロックがインストールされます。
    3. EC-CUBE管理画面の「デザイン管理から設置したいページに追加されたブロックを追加してください。

会員が寄付申請したポイントは、/data/downloads/donation.csv に"日時","顧客ID"、"寄付ポイント"で追加されていきますので、ショップ管理者様の方でエクセル等で集計して赤十字等の機関ポイント分の金額を寄付願います。

尚、管理画面で寄付されたポイントを確認出来るアドオンは、追って大河内氏より公開される予定です。

免責事項

このプログラムを利用した事により発生した、いかなる損害、被害についても当方は責任を負いません。ご利用される方の自己責任でご利用願います。


震度7エリアには祖母が住んでおり、福島原発のすぐそばの相馬市には義理の祖母と叔母が住んでいます。

こんな事しか思いつきませんでしたが、何もしないよりかはマシかと思ってます。皆様、ご協力をお願いします。

2011-02-24

EC-CUBE クラウドサーバを試してみた。速い!

前回のブログから気づけば1ヶ月以上も経ってしまいました。

なかなか継続して書くのは難しいですね...

EC-CUBEクラウドサーバ

最近案件で、サーバ選定からするケースがあったので、ちょうどリリースされたばかりのEC-CUBEクラウドサーバを試してみました。

EC-CUBE公式のクラウド環境という事で、その実力が気になっていました。特に、EC-CUBEの弱点とされるパフォーマンスが気になって夜も眠れませんでした。

EC-CUBEクラウドサーバファーストサーバさんが実際の環境を構築して運営されています。

サーバOSLinuxだそうで、聞いた話ではカーネルレベルでEC-CUEB用にカスタマイズしたそうです。いったいどんな事をしたんでしょうね。

ロックオンさんからファーストサーバさんのご担当者*1をご紹介頂き、検証用の環境を準備して頂けないか聞いてみました。

ちょっとまだリリース前なので... 相談してみます

との事だったのですが、もうその日の内に検証用の環境を準備して頂きました!

正直、いままでファーストサーバさんのサーバ(共有)は制約が多く、使いにくくてあまり好きではありませんでした。
しかしこの素早いご対応ちょっと好きになりました。

準備して頂いたのは、一番安いプランの「ファースト」(月額1,785円)です。

管理画面は普通ファーストサーバ

サーバ管理画面は他のプランと同じ見慣れた管理画面です。

f:id:xross-cube:20110224043705p:image

なので、「サーバの事はよくわからない」という方でも簡単に設定出来ます。

EC-CUBEインストールされた状態で環境が準備されるので、インストールでつまづく事もありません。

早速検証。1,000点商品を登録してみました。

f:id:xross-cube:20110224043706p:image

例の商品情報生成スクリプトでサクッと生成しました。

Apache benchをかけてみます。

とりあえず軽いのから
表示画面全商品一覧
コネクト数10
リクエスト50

続きを読む

*1:舟木様、非常に素早いご対応ありがとうございました。

2011-01-17

concrete5が重くなってきたら古いバージョンを消そう。

concrete5のちょっとしたTips
concrete5はページを更新する度にその履歴が「バージョン」として残っていきます。

間違えちゃったり、以前の状況を確認したい時なんかに便利なのですが、この履歴データのせいで、しばらく運用しているとデータベース肥大化していきます。

特にCollectionVersionBlocksとかすごいレコード数になったりします。


なので、

「あれ?最近なんか重くなってきたなー」

と思ったら古いバージョンを消しましょう。データベースからレコードが消えてデータベースが軽くなります。

消し方は、

  1. ページを編集モードにして
    f:id:xross-cube:20110117201114p:image
  2. 履歴」をクリック
    古いバージョン」をクリックすると最新のバージョン以外が選択されるので便利です。
    f:id:xross-cube:20110117201115p:image

    f:id:xross-cube:20110117201116p:image

  3. 削除」をクリック
    f:id:xross-cube:20110117201117p:image

  4. 編集モードを終了。
    f:id:xross-cube:20110117201118p:image

これで古い履歴が全部消えます。ついでにデータベース最適化しておいた方が良いでしょう。

f:id:xross-cube:20110117201119p:image

!注意!戻せませんので必ずバックアップを取ってから作業しましょう。

管理画面からデータベースバックアップが取れます。必ずバックアップを取ってから作業しましょう。

大量のページがあるサイトではかなり面倒

このやり方では1ページづつしか古いバージョンを消せません。
なので大量にページがあると厄介です。

自分でも欲しいので、近い内に全ページの古いバージョンを消すアドオンでも作ろうと思ってます。

もし、「待てないー!」という方はご自分チャレンジされても良いかもしれません。

/concrete/models/collection_version.phpのCollectionVersion::delete()に実際の処理が書いてあります。

2010-12-24

EC-CUBEをチューニング - MySQL:MySQLでもviewを使って8倍速にするカスタマイズ!!

さて、だいぶ間が開いてしまいましたが、前回の続きで、EC-CUBEMySQLで動かす際のチューニングの続きです。
僕がやった施策の中ではこれが劇的に効果がありました。

今回は、MySQLでもviewを使うという物です。

データベースviewとは、簡単い言うとSELECT文の結果をテーブルの様に扱える機能という事です。

EC-CUBEは、PostgreSQLで動かす場合は、商品情報カテゴリや規格の情報をまとめた物をviewにして、商品一覧画面や商品詳細画面等で利用しています。
ところが、EC-CUBEMySQLで動かす場合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 bytes

Concurrency 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] received

Connection 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:全件一覧表示