Azure×EC-CUBEでお手軽ネットショップ構築

第5回[開発合宿]Microsoft Azure WebサイトにおけるEC-CUBEの最適化

開発の概要

EC-CUBEは、Microsoft Azure Webサイトのギャラリーに登録されていますが、ドキュメントルートの直下に html フォルダが存在したり、開発・運用するのにあたり不便な箇所があったりと、実運用するには多少手を入れなくてはいけないような状況でした。

本格的な普及のためには、EC-CUBE の最適化が不可欠と考え、開発・運用ができるだけスムーズにすすむように不具合修正・カスタマイズを実施しました。

修正・カスタマイズの内容

今回の合宿では、以下のような修正・カスタマイズを実施しました。

  • Windows版PHP 5.3.28以降で画面が真っ白になる不具合修正
  • 郵便番号辞書登録のチューニング
  • ドキュメントルート直下のhtmlフォルダを不要にする
  • WebMatrix使用時のポート番号付きURLの最適化
  • DB接続情報の連携
  • マルチインスタンス使用時のログ多重書き込み制御
  • タイムゾーンへの対応

今回の内容のテストを実施するにあたり、Dropbox 経由でデプロイ可能なMicrosoft Azure Webサイトを作成し、検証用に作成したパッケージをデプロイしてインストールテストなど実施しました。

こちらはとても手軽に準備することができ、短期間での合宿に威力を発揮してくれました。

Windows版PHP 5.3.28以降で画面が真っ白になる不具合修正

こちらは、Microsoft Azure WebサイトのPHPバージョンが 5.3.28へアップロードしたため顕著化した不具合です。

本質的には、EC-CUBEが内部で使用する、ファイルパスの区切り文字の扱いに不備があったのが原因です。2014年4月18日現在、暫定パッチの適用されたEC-CUBEがギャラリにアップロードされていますので、ギャラリーのパッケージを使用した場合は、とくに問題は発生しません。

しかし、あくまでも暫定的な対応でしたので、根治対応をし、EC-CUBE本家のリポジトリにコミットしました。

郵便番号辞書登録のチューニング

Microsoft Azure Webサイトの無償版では、実行リソースに制限があり、多くのリソースを消費する郵便番号辞書登録機能は満足に動作しませんでした。

また、IISにてFastCGIを実行する際、標準で出力をバッファリングします。

IIS 6 用 FastCGI 拡張機能の構成
http://technet.microsoft.com/ja-jp/library/ff454029.aspx

上記ResponseBufferLimitの説明を参照してください。

このため、PHP側で出力をフラッシュしてもIIS側でのバッファリングがフラッシュされず、EC-CUBE の郵便番号辞書登録で使用しているプリローダーが表示されない不具合がありました。

まず、動作速度を向上させるため、EC-CUBEで使用しているMDB2ではなく、PHPのMySQL系の関数を使用するようにしました。

そして、日本マイクロソフトさんのご協力もあり、バッファリングの問題もweb.configに設定を記述することにより回避できるようになりました。

ただし、この方法はパスがハードコーディングされてしまうため、WebMatrixとMicrosoft Azureの連係時に不具合が発生してしまいます。環境によって web.configを分けることができれば良いのですが、WebMatrixでは未対応ということで、ギャラリーのパッケージには適用できませんでした。

Microsoft Azure Webサイトの環境のみで使用するTipsとしておきたいと思います。

cleardb.comの無償版ではSQL発行回数が1時間あたり3600回に制限されているため郵便番号辞書登録機能が問題なく動作するレベルには届きませんが、仮想マシンのMySQLを使用したり、WebMatrixの環境で登録した上でデータベースをMicrosoft Azure Webサイトにデプロイすれば問題なく使用できるレベルになりました。

ドキュメントルート直下の html フォルダを不要にする

ギャラリーに登録するためのパッケージングスクリプトを修正することで、ドキュメントルート直下に EC-CUBE がインストールされるようにしました。

単純な修正ですが、これに伴いインストーラや WebMatrix からの Web デプロイに対応するためのプログラムを大幅に改修しました。

WebMatrix使用時のポート番号付きURLの最適化

WebMatrixのWebデプロイを使用すると、WebMatrixのローカル環境からMicrosoft Azure Webサイト本番環境へのデプロイ、またはその逆がとてもスムーズに実施できます。

サイトのコンテンツのみならず、データベースも丸ごと同期できる優れた機能なのですが、環境の違いを吸収するためのプログラムを開発する必要があります。

WebMatrixのローカル環境で使用するURLはhttp://localhost:12345/といったポート番号付きのURLになるのですが、従来のEC-CUBEでは対応が不十分でした。今回は、スムーズに連携できるように対応しました。

DB接続情報の連携

WebMatrix の Web デプロイを使用した場合、データベース情報はdata/config/webmatrix.phpというファイルに書き込まれます。従来は、この情報をもとにdata/config/config.phpを自動生成していたのですが、data/config/webmatrix.phpから直接取得するよう修正しました。

マルチインスタンス使用時のログ多重書き込み制御

負荷に合わせて自由にスケールアウト可能な、マルチインスタンス機能はクラウドの大きな特徴なのですが、EC-CUBEが十分に対応しておらず、ある程度のカスタマイズが必要でした。

Microsoft Azure Webサイト以外のクラウド製品を使用する場合は、BLOBストレージを使用しなくてはならなかったりするため、難易度が高く、気軽に利用できません。

Microsoft Azure Webサイトの場合は、大きなカスタマイズをすることなくマルチインスタンス機能を使用できたのですが、ログの多重書き込みが発生する懸念がありましたので修正しました。

タイムゾーンへの対応

cleardbは標準でUTCとなっているため、JSTとなるよう修正しました。

今回開発をしてみての感想

細かな修正がほとんどでしたが、EC-CUBEを本格的にクラウドで安心して運用できるレベルになってきたと思います。

また、MacOSから仮想環境を使用してWindows上のWebMatrixを使用しましたが、環境構築、コードの修正、ファイルのアップロードなど、驚くほどスムーズに、軽快に作業することができました。

Microsoft Azure Webサイト固有の振る舞いに苦労するところもありましたが、単純なPHPレベルのカスタマイズでしたら、Linux上のApacheの利用と比べても、ほとんど差を感じませんでした。

改修前と、改修後のデモサイトは以下で公開しています。

改修前
http://nanasess-eccube1.azurewebsites.net
改修後
http://nanasess-eccube2.azurewebsites.net

また、今回の改修内容は以下Githubのazure-camp1ブランチにて公開しています。

開発内容
https://github.com/nanasess/ec-cube

今回改修したパッケージは近日中にギャラリーに掲載される予定ですので、Microsoft Azure Webサイト×EC-CUBE の真価を皆さんにも実感していただきたいと思います。

EC-CUBEでクラウドを本格運用しているサイトはまだ少ないですが、初心者の店舗主さんでも安心して利用いただけるよう、改善を続けていきたいと思います。

おすすめ記事

記事・ニュース一覧