Magento Cafe Tokyo #3にいってきた(2012-03-17)

いつものごとくメモ漏れ、勘違いご容赦ください。

Magentoケーススタディ(フロントエンド・バックエンド編)

西 宏和氏‏ @hirokazu1225

  • カテゴリを作ってもナビにでない
    • ルートカテゴリとサブカテゴリを理解しよう
      • 1つのショップに複数のルートカテゴリを登録できる
      • 有効フラグ-Off、カテゴリに登録しないOnになってない?

  • 商品を登録したのに表示されない
    • 商品と在庫の関係を理解しよう
      • 在庫フラグと在庫数は別
      • 表示対象ー>検索、カテゴリ
      • 有効フラグ-Offになってない?
  • カテゴリに商品が出ない
    • 商品とカテゴリ・サイトの関係を理解しよう
    • 特にマルチサイトのとき
      • 表示させるサイトの選択
      • サイトのカテゴリ
      • ※マルチサイトの場合、登録したサイトからしか会員ログインできない
        • フロントから登録後管理画面から設定できない
  • 税の設定がよくわからない
    • 税区分と税率の関係を理解しよう
      • BtoCの場合は内税とすべき。楽チン。税金が変わっても商品価格を変えるだけ
      • BtoBの場合は会社ルールを考慮する必要あり。切り捨て、切り上げなどなど
        • Magentoでやるのはややこしい
      • 外国では品目や地域によって税率が異なることも多い
      • 出荷する地域や購入者の地域で課税するのかなどなど
  • デザインテーマの変え方がわからない
    • テンプレートとスキンの関係を理解しよう
      • デザイン
        • default/blankを使う。JSやCSSが最小限の状態ー>これを変更するのが楽
      • 設定ー>デザイン
      • パッケージやテーマを変更する
      • テンプレートとレイアウトは同じものを使うことが多い
      • レイアウトのみ変更(カスタマイズ)するのも手
      • 標準の動き。現在テーマにパーツがない場合、どこに戻るか設定する
base/default ←最後にはここを使う
default/default ↑ここをみて
default/iphone ←ここにないと
      • ※base/defaultをカスタマイズしているとバージョンアップしたときに巻き戻るなど
  • Magento Connectが動かない
    • サーバの環境と設定を再確認しよう
      • →Webサーバ実行ユーザがファイルの書き込みできていいの?
      • インストールに失敗することがある
      • ローカルないしテストサーバでダウンロードしておき、ファイルアップロードする方法を推奨
    • 手動でダウンロードするには。
      • downloader/.cacheの下にダウンロードされる
      • ただし、依存性がある場合は手動で修正する必要がある
      • だめなら、ソース読め
  • 配送料金表の登録方法がわからない
    • 設定画面のスコープを1段下げるとでてくる
      • 設定ー>配送方法ー>料金表→CSVでエクスポートしてからインポートする。
      • CSVにはロケールと料金が書き込める。CSVロケールが合わないとだめ。英字表記注意
  • 住所表示の変更方法がわからない
    • 設定画面で変更可能
      • 設定ー>顧客ー>顧客設定→住所表記テンプレートを書き換える

  • 余計なバナーを消したい
    • layoutのcatalog.xmlを編集して削除
      • app/design/frontend/base/default/catalog.xml
  • エクステンションのインストールに失敗したらサイトが見れなくなった
    • Root/maintenance.flagを削除する!
      • index.php 53行に メンテナンスファイルがあると503.phpを返すようになってる
  • エクステンションインストールしたのに設定画面にアクセスできない
    • 権限を保存しなおせばOK

  • Basic認証をかけたら画像をアップできなくなった
    • MagentoはFlashUploaderを使っているがBasic認証が通らない
    • NoFlashImageUploaderを使おう
      • ただし、CMS機能には非対応。複数コンテンツを同時アップロードできない
  • スマホだけで別のテーマで表示したい
    • UserAgentでテーマ切り替えする機能を利用するのが楽。ただし不完全
    • →キャッシュ使うとUserAgentでの切り替えができなかったり
    • iOSandroidでもPCサイトが見るのは無理
    • →別々のサイトをつくってあげるほうが楽チン

  • ウェブサイトストア ストアビューの住み替え
    • 同一サイト=マルチストア
    • マルチサイト=マルチストア(ドメインが変わってもOK、会員情報を完全にわけることができる)

Magentoケーススタディ(チューニング編)

株式会社フラッツCTO 天方氏

  • 背景
    • Magentoのパフォーマンスについての相談をうけた
    • リリース基準を満たせず、何度かあったリリース期日にリリースできない状態が続いていた
  • サイトの特徴
    • SKU数 約4500
      • 将来的には数十万件
  • 検索条件の軸が非常に多い
      • 商品に検索からはいる
    • スループット要件があった(25Request/Sec以上)
  • バージョン
    • Magento1.4.2
    • Apache2.2+mod_php
    • PHP5.2x+APC
    • MySQL5.1
  • ハード構成
  • サーバスペック
    • ロードバランサ(DNSラウンドロビン
    • WEBサーバx3 仮想サーバXeon2.4G
    • DBマスタ(更新系) 仮想サーバx1Xeon2.4G Mem8GB
    • DBスレーブx3(検索系はWEBサーバ:DBスレーブ=1:1) 物理サーバx2 i3 16GB、仮想サーバ--x1 Xeon2.4 8GB

  • パフォーマンス測定(改善前)
    • 22-24req/sec(トップページ、商品検索、空ページ)
    • abコマンドで測定
  • 問題点
    • request/secの目標値の25以上に届いていない
    • ページの表示が遅い
    • クエリキャッシュが効いての数字。効かないとさらに遅い
  • DBマスタの設定を変更する
    • my.cnf

key_buffer=512m ->16m
innodb_buffer_pool_size=768m->4G (DBスレーブは10GB)
など

  • その他
    • テーブルが一部MyISAMになってえいるのをInnoDBにした
    • 複数のエンジンを使うとメモリを多く消費する
  • 結果
    • ほとんど変わらない。。。
  • 再調査
    • CPU負荷
      • DBマスタの負荷が400%いっぱいいっぱい
    • mysql-slow.logを確認
      • Insert・Updateで詰まってる
    • もしかしてDBマスタの更新系トランザクションの性能限界?
      • セッション情報をDBに更新していた。ー>DBマスタへの負荷で一杯
  • Memcache設定
    • app/etc/local.xmlに追加する
  • Webサーバの一台にmemcacheを設定して他のWebサーバから共有した
  • 結果
    • 32-36req/sec(速くなった。要件クリア)
    • (クエリキャッシュが効いている状態)
  • 検索ページはクエリキャッシュが効く前
    • 0.26req/sec
    • ApacheSolrなど入れる必要あるかも
  • 課題
  • 検索
    • 検索クエリの最適化
      • ApacheSolr組み込み
    • 総合対策
      • MagentoCE1.6へ変更(パフォーマンス向上する)
      • MagentoEnterpriseEdition変更(劇的に向上する)
  • 教訓
    • セッションをDB管理する場合は、DBマスタのトランザクション性能に気をつける
    • Magentoの標準は日本語検索弱い。日本語検索はApacheSolrを使うなど
    • PHPは5.3のほうが速い ZendServer CE PHP5.3+APCも考慮
    • MySQL5.5のトランザクション性能が高い
    • 複数WEBサーバの場合、画像NFSを使うこともあるがWEBサーバに画像をおいてrsync同期とかCDN導入するなど
    • MagentoEEの導入
      • 本家のMagentoCEとEEの性能比較のPDFを見てみると良い*1
      • EE1ライセンス100万/年ぐらい。CE40インスタンスで使っている事例あり。EEなら数台になるかも
    • ログ取得を有効にしているとページみるごとに1Insert走る。PVを置いと一日でGB超える(上記では無効にしてた)
      • cf.AWS EC2ラージインスタンスで実測。MagentoEE 100req/sec、MagentoCE 12req/secぐらい
      • メモリは最低4GB。APCでキャッシュするならMemoryほしい。管理画面が遅い
      • APCのキャッシュをMagentoのキャッシュ置き場として使う。
    • ROOT/.htaccessにJS,CSSはキャッシュするように設定。ただしCDN使う場合はダメ
    • エクステンションを使うなど*2
      • セッション情報の保存に、当初memcacheを使っていたが、ロードバランサでセッションが切れる問題があった
      • →WEBサーバごとに独立したmemcacheを設定していた

Magentoケーススタディ(カスタマイズ編)

西 宏和氏‏ @hirokazu1225

  • default/blankを複製してカスタマイズ
    • 余計な装飾がない
    • バージョンのあわないテーマを導入すると壊れることがある。
    • アップデートすると問題が発生することがある
  • エクステンションの競合
    • rewriteは1回しかできない
    • エクステンションAとエクステンションBが同じクラスを拡張している場合、どちらかしか使われない
    • クラスの継承関係は自動で解決しない
      • コードを読んで自力で調整

  • インデックスが更新できない
    • ゴミデータがどこかにある(外部キー張ってるのに)→データベースをみて解決するしか
    • Magentoのシステムログをみて解決する
    • インデックスが更新できないとURLが更新できない
    • 「商品とカテゴリとURL書き換えインデックス」「EAVカテゴリストラクチャをflatstructureに変換したインデックス」でよく起きる
      • →DBを見るか、プログラム追いかけるか

  • データが大きすぎるとApachePHPタイムアウトする
    • 商品点数が5万件超えてくると起きる。
    • shell/indexer.phpを実行する
      • →但しファイルのパーミッションがWEB実行ユーザ以外で実行するとオーナーが不適切になることがある
  • 商品登録でエラーがでる
    • カスタムオプション周りでエラーが出ることがある
    • 下記あたりにゴミがある。

catalog_product_option
catalog_product_option_title
catalog_product_option_type_price
catalog_product_option_type_title
catalog_product_option_type_value

  • バージョンを上げたいんだけど
    • coreいじってないですか?

base/default
default/default
default/modern
default/blank
default/iphoneあたり

  • いれてるエクステンションは最新ですか?
    • 有料の場合は、買い直すなど
    • 無料の場合は、バージョンアップに対応してないなど
  • OK?じゃあテスト環境でテスト
    • 2回目からはきっとスムーズにできるよ

QAコーナー

Q.osCommerceからの乗せ換えをしたいが、どのパッケージを選べばいいの?

  • Magentoは、eBayの資本がはいって、コミュニティの窓口として位置づけられている。すぐに開発が停まることはない。
  • ZenCartは、バージョンアップ停滞。中の人も現状で満足してる(?)
  • EC-Cubeは箱をあけたらすぐ使える。小型店舗向け。ベトナムやUSに展開といっているが???? 今後もコアには手を入れない方針。再設計はちょっとありえない。多言語対応、ダウンロード販売は無理。

Q.多言語化ダウンロード販売をしたいが?

Q.材質や大きさなどと細かく入力して注文するフォームは可能?

Q.CMSとの連携エクステンションっていいのある?

  • 単純にリンクさせるタイプと、MagentoのAPIを呼び出すリッチタイプとがある。typo3WordPress連携リッチタイプ、ただし重い。Joomla!Drupalの連携エクステンションもあり。