PHPカンファレンス2008レポート(中編)
PHPによる大規模商用サービスの裏側
岡田大助
@IT編集部
2008/7/30
2008年7月21日、日本PHPユーザ会主催のイベント「PHPカンファレンス2008」が東京・大田区産業プラザ(PiO)で開催された。
PHP5.3やPHP6の最新動向をお届けした前編「PHPに押し寄せるリスクと国際化の波」に引き続き、中編ではぐるなび、楽天、サイボウズといった企業におけるPHP開発事例の裏側をレポートする。
手作り感たっぷりのぐるなびが食のポータルサイトになるまで
ぐるなびは、日本における飲食店情報を扱う草分け的Webサイトであり、代表的な“食”のポータルサイトの1つといっても過言はない。1996年6月に、交通広告代理店NKBの1事業部門としてスタートしたぐるなびは、2000年2月に株式会社として独立する。以来、さまざまな食に関する情報サービスを立ち上げ、月間7億2000万PV(2007年12月)、会員数588万人を記録するほどになった。
佐藤 史彦氏 (写真提供:月宮 紀柳氏) |
ぐるなびの技術department 開発第2グループ グループ長の佐藤史彦氏によれば、「関連サービスを含めたほとんどすべてのWebコンテンツがPHPで開発されている」という。佐藤氏の講演「PHPでつくる ぐるなび」は、事業の拡大に伴って拡張されるシステムのあり方を示唆するものだった。
2008年3月時点で、ぐるなびが情報を提供する店舗数は約50万店舗に達した。このうち、6万2000店ほどがメニューや地図などの詳細情報を更新している。
システムの大枠としては、飲食店や社内のスタッフだけがアクセスできる「限定公開Webサービス」と一般ユーザーがアクセスできる「一般公開Webサービス」の2つに大別できる。佐藤氏は、「システムの大枠は変わっていないが、内部の構成は時代に応じて変化している」と振り返った。
最初期(1996〜2002年)においては、店舗データをExcelファイルで管理し、店舗の詳細情報ページは手作りによる静的なHTMLだった。WebサーバはWindows+IISで、店舗検索ユーザーインターフェイスにDelphiを使っていた。
「手作り感たっぷりでスタートしたぐるなびだったが、株式会社になるタイミングでオープンソースを採用し、全面的なリニューアルを行った」(佐藤氏)期間が2002〜2004年だ。店舗データの保管や検索システムはPostgreSQLに移行し、管理機能と店舗検索のユーザーインターフェイスにPHPが採用された。WebサーバもLinux+Apacheとなり、店舗の詳細データは静的なHTMLのままではあったもののCMSを導入している。
店舗数が数万店になる2004年頃からは検索用データベースの負荷が高くなった。そこで、カテゴリマスタなどを、参照が軽量のMySQLに切り替え、全文検索システムへと移行していく。
2007年からは、店舗データを格納するデータベースがOracleに変わり、社内でのデータ共有にXMLが採用された。佐藤氏によるデータベースにOracleを採用した理由は、「最も忙しい年末に店舗データがすべて飛んでしまうという事件などもあり、データベースの負荷に悩まされ続けてきたから」だそうだ。
現在のぐるなびは、管理機能Web、店舗詳細Web、店舗検索Webの3つのフロントエンドにそれぞれPHPを利用している。管理機能Webから入力された情報はOracleに格納されるほか、店舗詳細ページのHTMLはNAS上に集約される。また、Oracleに入ったデータは店舗情報XMLとしてNAS上に配置される。
開発のしやすさゆえの悩みにどう立ち向かうのか
佐藤氏は、「Webサービスを展開しているものとして、ちょっとした変更に対応したいという要求が強く、PHPが動的スクリプト言語であるというのが強みであり、導入理由だと思う」と語る。フロントエンドの軽量な実装、日本語の取り扱いやすさ、導入コストの低さなども導入の決め手だったようだ。
しかし、「プログラミングに慣れていない人がパラパラパラとコーディングしていくと脆弱性となる可能性がある」とも指摘する。対応策としてぐるなびでは、セキュアコーディングの社内勉強会や、完成品に対して外部によるセキュリティ診断を行っているという。
また、PHPの基本設定に特別な仕組みは導入していないが、使用しない機能は基本的に停止し、内部エンコーディングはUTF-8で統一している。ただし、「季節によってデータベースへの負荷が増減するため、Webサーバをスケールアウトしやすいような構成をとっているのが特徴的」と語った。
PHP5の導入はおよそ1割に過ぎない。可能な限りサービスごとに同一機能が個別に実装されているような無駄をなくすため、共通機能を分離・統合しながらリファクタリングで移行していく方針だ。佐藤氏は「その結果、移行がやや遅れ気味」だと苦笑していた。
国際化対応については、中国・上海に作った子会社の例を出して、現場の雰囲気を伝えてくれた。この子会社は、上海や北京の飲食店情報を中国語と日本語提供している。ところが、中国の開発者はあまりPHPに詳しくなく、当初はJavaで開発された。しかし、現地在住の日本人向けコンテンツを作るようになってからPHPを採用。実装の標準化をPHPで行うプロジェクトが進行中だという。
オープンソースのリスクを知ったうえで、ハイブリッドな運用を
最近でこそ楽天は、Rubyのまつもとゆきひろ氏を楽天技術研究所のフェローとして招聘(しょうへい)するなどRubyの本格的な開発で注目を集めている。しかし、多くのアプリケーションにおいて依然としてPHPが利用されている。
安藤 祐介氏 (写真提供:月宮 紀柳氏) |
楽天の開発部 開発環境整備課 アーキテクチャ標準化推進グループの安藤祐介氏は「楽天×PHP 楽天におけるPHPの過去・現在・未来」と題する講演を行い、同社のオープンソースソフトウェアへのアプローチおよびフレームワークの運用方法を紹介した。
楽天市場のトランザクション数は1997年の創業以来増加の一途をたどっている。トラフィックは過去5年間で175Mbpsから8.6Gbpsへと50倍に増加した。楽天はハイブリッドな環境を構築しており、必要に応じてサンやオラクルといった商用製品とコストの安いオープンソース製品を使い分けているという。
ただし、オープンソース製品を利用する場合の留意点として、安藤氏は「十分な検証、特にセキュリティ面の継続監視を行い、必要ならばパッチも作成し、外部からの技術協力も得るといったようなオープンソースのリスクをケアした上で大規模に活用している」と語る。
ところで大規模開発という場合の指標は何だろうか。安藤氏は目安として、アプリケーションの数、サーバ台数、PV、開発者の人数などを挙げる。それぞれを楽天のPHP開発に当てはめた場合、150以上のアプリケーション、800台以上のサーバ群、1日当たり最大5000万PV、最大1000人以上のエンジニアとなる。また、PHPコードの量では、ファイル数が120万ファイル、行数にして900万行となる。この結果をもって同氏は「楽天は日本有数のPHPユーザーといってもいいだろう」と語る。
日本有数のPHPユーザー、楽天の戦いの歴史
「楽天のPHP利用の歴史は、あまり穏やかな歴史ではなく、サービスの展開スピード、開発コスト、増加する負荷など、さまざまな戦いの歴史でもある」と安藤氏は切り出す。2000年頃の黎明(れいめい)期ではPHP3を利用してWeb向けの簡単な機能を実装していた。「ところがすぐに戦いが始まった。PHP4への移行、とにかく作りまくるという大量生産、PV上昇に伴う負荷などだ」と振り返る。当時は、設定の標準化(safe_mode)、SmartyやPEARの利用、スレーブデータベースの利用などで対応していたそうだ。
次に来たのが独自フレームワーク期(2003年頃)だ。安藤氏は「この頃は業界的にPHPの統一的なノウハウが少なかったため試行錯誤の繰り返しだった」と語る。平行開発によって構造がバラバラになっていき、社内で車輪の再開発が行われ、運用コストが増えていった。その反省として、開発スピードを保つために標準化の推進が開始され、社内ライブラリやフレームワークの整備が急務となった。
標準化したことによるメリットは開発品質の向上につながる。PVやPHPの応答性能、エラー監視などが同じ基準でロギングできるようになり、異なるサービス同士を比較することが可能となった。
この時期に、現在でもトップ5に入るほど大規模なサービスである「楽天GORA」の開発が進められた。そこで、十数名以上での平行開発やさまざまな負荷対策を導入するために、Mojaviに似た独自フレームワークが採用された。
2005年頃には社内フレームワークとしてMojaviを正式に導入した。安藤氏は「それまで社内では設計思想の異なるフレームワークがバラバラに採用されており、フレームワークを統一することでそれぞれが構築したノウハウを統合することが可能になった」という。
この結果、PHP4による開発スタイルが確立し、新卒エンジニアなども開発に投入されるようになった。なお、データベース周りやビジネスロジックの分離などについては未整備のままだったが、極端な事例を除いて、順調に開発・運用が進むこととなった。
2005年になってPHP5への移行が始まり、再び独自フレームワークを試すようになった。これはサービスの要件に応じてさまざまなフレームワークを試し、実績を収集するためだったという。結果的に、symfonyが社内標準として採用され現在に至る。その理由は、Mojaviの直系だったこと、スケルトン生成機能があったことだ。
安藤氏いわく「いくつか出てきたsymfonyの事例の中で突飛なものを挙げるとすれば、Ajaxをユーザーインターフェイスに採用したWebメールであるInfoseekメール」とのことだ。これ以外にも、十分なテストと検証が行われたサービスから投入が始まっているという。
パッケージソフトウェアをPHPで作る理由
サイボウズといえば多くの企業で導入されているWebグループウェアの1つだろう。いくつかのバージョンがあるが、「サイボウズガルーン2」はユーザー数300人以上の中堅企業向けの製品で、サーバ構成によっては1万人規模にも対応できるような柔軟性を持っている。PHPで開発されたガルーン2を題材に、サイボウズ開発本部開発部 ガルーン開発グループの米川健一氏が「大規模向けパッケージソフトウェアとPHP」と題する講演を行った。
米川 健一氏 (写真提供:月宮 紀柳氏) |
ガルーン2の画面数は1200枚以上、使用されているSmartyテンプレートは2500枚以上、PHPスクリプトは4500ファイル以上。開発スタッフは日本人10名程度、オフショア開発のベトナム人が5名程度だそうだ。また、「CyDE2(サイドツー)」というフレームワーク上で開発されており、PHP4とMySQL、テンプレートエンジンとしてSmartyが搭載されている。
米川氏は、「パッケージソフトウェアのガルーン2にとって『スケーラビリティ』はポイントの1つ」と語る。ユーザー側のサーバ構成を開発者側で決めることができないため、「ガルーン2はサーバ構成をユーザーが自由に決められる機構だけを用意して、ユーザー側に選択してもらうアーキテクチャになっている」という。
また、ガルーン2はパッケージソフトウェアである以上、Webアプリケーションで使われるPHPとは異なるポイントが4つある。
1つ目は、ユーザーが簡単にインストールできること。米川氏は「httpd.confを開かせたら負けだと思っている」と切り出す。開発ポリシーとしてユーザーが各種設定を行わなくて済むように、Webサーバの自動検出、デプロイメントの標準化、PHP本体をハックして独自SAPIで実行できるようにしている。
2つ目は、パフォーマンスを要求される部分はCで書くこと。日付・時刻処理のコア部分やAES暗号ライブラリ、XMLパーサ/CSVパーサ、ライセンス処理など高いパフォーマンスが要求される部分は独自PHP拡張を入れている。
3つ目は、グループウェアならではの機能ともいえるかもしれないが、登録されたイベントを定期的に実行するためのスケジューリングサービスの実装だ。米川氏によれば、「Windowsでも使えるcron、PHPでもコントロールできるcron」とのこと。GUI画面から簡単に設定できるようになっているため、ユーザーの使い勝手が向上している。
4つ目は、セキュリティ対策だ。クロスサイトスクリプティング(XSS)対策には、ホワイトリスト方式を採用。Smartyのプレフィルタを利用することで、コンパイル前に必ずescape modifierを自動的に埋め込むようにしている。これにより、開発者によってエスケープ処理を忘れてしまうといったミスを防ぐことができる。エスケープが不要な場合は、no_escapeを明示的に指定する。
クロスサイトリクエストフォージェリ(CSRF)対策には、CSRF対策をするアクションリストを用意している。リスト内のアクションへのリクエストは専用のチケットが必要となり、チケットのないリクエストはエラーを返すようにしている。米川氏によれば、「この部分の処理は当初JavaScriptで行っていたものの、スクリプトが読み込まれる前に次のページに遷移されてしまうなど処理が間に合わないことがあった」という。
課題となっているのはPHP4のサポート終了問題だ。前述のようにPHP本体にハックを入れているため、PHP5への移行が難しい部分もあるようだ。また、パッケージソフトとして提供しているため、ユーザーに対するサポートも重要な課題である。米川氏は「PHP5への移行も検討している。また、PHP4のままで継続していくのであれば、PHP5用に作られたセキュリティパッチなどを独自にガルーン2に当てていくことも考えている」と語った。
次回は、PHPカンファレンス2008のメインイベントとなったパネルディスカッション「激論! PHPの次に学ぶ言語はこれだ」を、できるだけライブ感たっぷりにレポートする予定だ。
Coding Edgeフォーラム トップページ |
PHP関連記事 |
例外処理の実装を把握する PHP5で広がる! 開発環境(1) PHP4のサポートが終了し、いよいよPHP5への移行を視野に入れる時期が来た。PHP5の機能を生かした開発のポイントを紹介 |
|
クライアントPCに言語環境を入れる理由 Mac OS X+PHPでオールインワン環境(準備編) Webアプリ開発者に人気のMac OS X。効率的な開発のために複数バージョンのPHPを実行する環境を構築してみよう |
|
PHPに押し寄せるリスクと国際化の波 PHPカンファレンス2008レポート(前編) PHP4のサポートが完全に終了する。多くの新機能が投入されるPHP5.3へ移行か、国際化対応で開発が遅れるPHP6を待つか |
|
PHPによる大規模商用サービスの裏側 PHPカンファレンス2008レポート(中編) 企業のWebアプリケーション開発現場で利用されるPHP。開発現場の裏側にはさまざまなドラマが隠されている |
|
PHPユーザーは本当にほかの言語を知らないのか? PHPカンファレンス2008レポート(後編) PHPは本当にダメな言語なのだろうか。Perl、Ruby、Python、Java、JavaScriptの使い手が白熱した議論を行った |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|