2011-12-07
FuelPHPとCodeIgniterでCMS作ってパフォーマンスを比べてみた
OSS, FuelPHP, CodeIgniter, PHP, オープンソース
FuelPHP Advent Calendar 2011 ということで、PHP フレームワーク FuelPHP に関するブログをクリスマスまでお届けしています。前日の@9ensanさんの記事はFuelPHPで作るログイン管理
過去記事一覧は、FuelPHP Advent Calendar 2011
CodeIgniterという軽量で高速な非常に気に入っているPHPのフレームワークがあるのですが、最近ライセンス問題が怪しいのと、バージョン2系になってから開発体制も怪しくなっていたので似た様なフレームワークを探していました。
すると、concrete5でもお世話になっている@kenji_sさんがFuelPHPをベタ褒めしていたので試してみる事にしました。
なるべく実際の環境に近い様にと超簡単なCMSを作って比べてみます。
と言う様な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 second | CodeIgniter | FuelPHP |
|---|---|---|
| 1回目 | 42.74 | 39.38 |
| 2回目 | 30.51 | 46.43 |
| 3回目 | 17.15 | 17.46 |
| 4回目 | 45.06 | 46.77 |
| 5回目 | 44.87 | 21.95 |
| 平均 | 36.06 | 34.39 |
結論から言うとパフォーマンスは変わらなそうな感じです。
今回の環境はクラウド環境なのでどうもムラがある様です。
ちなみに、APCを有効にしてベンチかけたら下記の様な感じでした。*1
| Requests per second | CodeIgniter | FuelPHP |
|---|---|---|
| 1回目 | 126.33 | 72.11 |
| 2回目 | 119.95 | 26.98 |
| 3回目 | 37.30 | 17.46 |
| 4回目 | 25.92 | 93.03 |
| 5回目 | 119.19 | 49.71 |
| 平均 | 85.74 | 51.86 |
ちょっとCodeIgniterの方が速いですね。
結論
FuelPHPは書き方や使い方もCodeIgniter近いですし、なによりライセンスがMITでパッケージ機能があるのでかなり良い感じです。
今後も引き続き使ってみたいなーと思いました。
次は@ounziwさんの「FuelPHP の view に PHPTAL デザインテンプレートを使う」です。
2011-10-01
超使える!EC-CUBEのAPI機能のモジュールが無料で公開されてました!
EC-CUBE, 連携, WEB, カスタマイズ, オープンソース
久しぶりのブログです。
気付いたら全開前回の記事から数ヶ月経ってしまっていました。
先日EC-CUBEのクラウドサーバがファーストサーバさんからリリースされ、色々な特典が付いている事もあって盛り上がっている様です。
その中でもfacebook連携機能と言うのが特に良い感じです。
どんな機能なのかな?と内容を見てみると、EC-CUBEにAPIモジュールをインストールし、facebookのアプリからそのAPIをたたくという物でした。
無料で公開中!
で、このAPIモジュール、株式会社ドリームブリッジさんという会社が開発されたのですが無料で公開されているんです!
しかも2.4系用と2.11系用両方あります!
いやー、素晴らしすぎます。
しかもxmlやjsonやphpのシリアライズ値とか色んな出力形式に対応しています。
元々、僕もEC-CUBEにはAPIが必要だと思って色々実装の仕様を検討していました。色々参考になる仕様があって、どの仕様に合わせようかと思っていて手が止まっていたんですが、ついに出ました!
APIでどんな事ができるの?
これは凄い事なんです。
EC-CUBEの弱点として、コンテンツの作成・管理機能が弱い事がありました。
しかし、このAPIを使えば、facebookやwordpress、concrete5等のCMSでEC-CUBEの商品情報が自動的に簡単に掲載出来るんです。
追記:試しにconcrete5で表示させてみました。 http://c542.xross-cube.net/
ひとつのEC-CUBEをカートエンジンとして利用して、コンテンツを他のCMSで作って複数サイト展開とかも簡単です!
残念ながら現在は商品情報のみ
非常に素晴らしいAPIモジュールですが、現在は残念ながら商品情報にのみ対応しています。
カテゴリリストの表示やユーザー情報等には対応していません。(ログインのAPIも欲しいですね)
とは言え、素晴らしい事です。
2011-05-12
EC-CUBE 2.11系で変わった事 -商品一覧の取得方法-
ショッピングサイト, WEB, PHP, カスタマイズ, EC-CUBE, オープンソース
遅ればせながら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共に一番早かった様です。
なので、もし商品一覧で表示する項目や並び順をカスタマイズされたいのであれば、一度このクラスの動きを追っておく事をオススメします。
2011-05-11
EC-CUBE2.4.4以前のバージョンに存在するクロスサイトリクエストフォージェリの脆弱性への対応
ショッピングサイト, セキュリティ, バグ, EC-CUBE, カスタマイズ, EC, オープンソース, Tips
2011年5月10日、JVNからEC-CUBEの2.4.4以前のバージョンに存在するCSRFの脆弱性に関する情報が公開されました
JVN#37878530 EC-CUBE におけるクロスサイトリクエストフォージェリの脆弱性
CSRF*2とは、簡単に言うと、どんなサイトやHTMLメールからでも、ユーザの意図しない情報をターゲットのサイトに送信させて、望まない操作をさせる事が出来るという物です。*3
特にサイト管理者の方はEC-CUBEの管理画面にログインしたままの状態で、よく解らないリンクやボタンをクリックしない様にしましょう。*4
2.11.0以降のバージョンには存在しませんので、2.11.0以降を利用されている方は大丈夫です。*5
2.4系から2.11系へのデータ移行ツールもリリースされていますが、2.11系は2.4系とは大きく変わり、簡単にはバージョンアップ出来ないのも事実です。
特に多数のカスタマイズを加えていると、より作業量は増えてしまいます。
とりあえず2.4系をそのまま使って、この脆弱性に対応する為のやり方を今回はご紹介します。
2011-05-10
concrete5 の簡単なテーマの作り方
個人的メモ, テーマ, WEB, デザイン, PHP, オープンソース, Tips, CMS, concrete5
僕が日本語化に参加している、直感的CMS、concrete5の簡単なテーマの作り方をFacebookに書いたので、こっちにも書いておきます。
- 適当にHTML+CSSでページを作る。
- HTMLファイルのファイル名をdefault.phpに変える。
- DTD宣言の前に魔法の呪文1を追記する。
<?php defined('C5_EXECUTE') or die(_("Access Denied.")); ?>
- <head>の最後に魔法の呪文2を追記する。
<?php Loader::element('header_required'); ?>
- ブロックを置きたいところに魔法の呪文3を追記する。
<?php $a = new Area('[area name]');//好きなエリア名を入れる、大体Side barとMain $a->display($c); ?>
- </body>直前に魔法の呪文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
2011-04-02
EC-CUBEのゴールドパートナーになりました!
ショッピングサイト, WEB, EC, オープンソース, EC-CUBE, OSS
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のポイント寄付ブロックを作成しました。
EC-CUBE, WEB, カスタマイズ, オープンソース, 東北地方太平洋沖地震
2011年3月11日、東北地方でM8.9、最大震度7の大地震が発生しました。
私たちは何か出来る事が無いかを考え、EC-CUBEのコアコミッターの大河内氏と共に、EC-CUBEで構築されたサイトで、会員が保有するポイントを寄付出来るブロックを作成しました。
EC-CUBEでショップを運営されているショップオーナーの皆様、これ使って是非ご協力をお願いします。
ショップオーナー様で、会員のポイント分の金額を寄付しても良いという方は無償にてご利用頂けます。
2011-3-12 18:37 追記:
EC-CUBEコアコミッターの大河内様が管理機能を追加してくれました。ご利用される場合は、上記の「寄付ポイント管理アドオン」をダウンロードしてください。
使用方法
会員が寄付申請したポイントは、/data/downloads/donation.csv に"日時","顧客ID"、"寄付ポイント"で追加されていきますので、ショップ管理者様の方でエクセル等で集計して赤十字等の機関へポイント分の金額を寄付願います。
尚、管理画面で寄付されたポイントを確認出来るアドオンは、追って大河内氏より公開される予定です。
免責事項
このプログラムを利用した事により発生した、いかなる損害、被害についても当方は責任を負いません。ご利用される方の自己責任でご利用願います。
震度7エリアには祖母が住んでおり、福島原発のすぐそばの相馬市には義理の祖母と叔母が住んでいます。
こんな事しか思いつきませんでしたが、何もしないよりかはマシかと思ってます。皆様、ご協力をお願いします。
2011-02-24
EC-CUBE クラウドサーバを試してみた。速い!
オープンソース, EC-CUBE, チューニング, WEB, MySQL, PHP, EC
なかなか継続して書くのは難しいですね...
最近の案件で、サーバ選定からするケースがあったので、ちょうどリリースされたばかりのEC-CUBEクラウドサーバを試してみました。
EC-CUBE公式のクラウド環境という事で、その実力が気になっていました。特に、EC-CUBEの弱点とされるパフォーマンスが気になって夜も眠れませんでした。
EC-CUBEクラウドサーバはファーストサーバさんが実際の環境を構築して運営されています。
サーバのOSはLinuxだそうで、聞いた話ではカーネルレベルでEC-CUEB用にカスタマイズしたそうです。いったいどんな事をしたんでしょうね。
ロックオンさんからファーストサーバさんのご担当者*1をご紹介頂き、検証用の環境を準備して頂けないか聞いてみました。
との事だったのですが、もうその日の内に検証用の環境を準備して頂きました!
正直、いままでファーストサーバさんのサーバ(共有)は制約が多く、使いにくくてあまり好きではありませんでした。
しかしこの素早いご対応!ちょっと好きになりました。
準備して頂いたのは、一番安いプランの「ファースト」(月額1,785円)です。
管理画面は普通のファーストサーバ

なので、「サーバの事はよくわからない」という方でも簡単に設定出来ます。
EC-CUBEがインストールされた状態で環境が準備されるので、インストールでつまづく事もありません。
早速検証。1,000点商品を登録してみました。

Apache benchをかけてみます。
とりあえず軽いのから
| 表示画面 | 全商品一覧 |
| コネクト数 | 10 |
| リクエスト数 | 50 |
2011-01-17
concrete5が重くなってきたら古いバージョンを消そう。
ウェブサイト, チューニング, WEB, PHP, MySQL, オープンソース, Tips, CMS, concrete5, 個人的メモ
concrete5のちょっとしたTips。
concrete5はページを更新する度にその履歴が「バージョン」として残っていきます。
間違えちゃったり、以前の状況を確認したい時なんかに便利なのですが、この履歴データのせいで、しばらく運用しているとデータベースが肥大化していきます。
特にCollectionVersionBlocksとかすごいレコード数になったりします。
なので、
「あれ?最近なんか重くなってきたなー」
と思ったら古いバージョンを消しましょう。データベースからもレコードが消えてデータベースが軽くなります。
消し方は、
これで古い履歴が全部消えます。ついでにデータベースを最適化しておいた方が良いでしょう。
!注意!戻せませんので必ずバックアップを取ってから作業しましょう。
管理画面からデータベースのバックアップが取れます。必ずバックアップを取ってから作業しましょう。
大量のページがあるサイトではかなり面倒
このやり方では1ページづつしか古いバージョンを消せません。
なので大量にページがあると厄介です。
自分でも欲しいので、近い内に全ページの古いバージョンを消すアドオンでも作ろうと思ってます。
もし、「待てないー!」という方はご自分でチャレンジされても良いかもしれません。
/concrete/models/collection_version.phpのCollectionVersion::delete()に実際の処理が書いてあります。
2010-12-24
EC-CUBEをチューニング - MySQL:MySQLでもviewを使って8倍速にするカスタマイズ!!
ショッピングサイト, チューニング, MySQL, カスタマイズ, EC, オープンソース, EC-CUBE, Tips
さて、だいぶ間が開いてしまいましたが、前回の続きで、EC-CUBEをMySQLで動かす際のチューニングの続きです。
僕がやった施策の中ではこれが劇的に効果がありました。
データベースの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 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:全件一覧表示














