PHP at Yahoo!を読む
イタリアで開催されたPHPDay 2007にてYahoo! EuropeのFederico Feroldi氏が行なった「PHP at Yahoo!」のプレゼン資料が、氏のブログで公開されました。
Yahoo!が社内でどのようにPHPを使用しているのかということはこれまでにもRasmus Lerdorf氏のプレゼンなどで明らかにされてきましたので、「PHPのビルド時にはモジュールはほとんど組み込まない」とか「ビジネスロジックをエクステンションとして実装する」といったことは皆さんご存知だと思います。今回も前半はそんな感じの内容ですが、途中で実装よりの具体的な話題になってきたと思ったら、Yahoo!が利用しているテンプレートエンジン r3がオープンソース化したと書かれていてビックリ。しかもsymfonyのビュー層にも組み込んで使っているとか。
他にもDrupalの評価を始めていることや、del.icio.usでsymfonyを使っていることなどいくつか目新しい話題があったので、内容を簡単に訳出してみました。
Yahoo!にまつわる数字
- 20の国と言語
- 500万人/月のユニークビジター
- 238万人のアクティブな登録ユーザー
- 平均3.5Billion/日のページビュー
Yahoo!とPHPの歴史
- 1994年に独自のC/C++ソフトウェアでスタート
- OSSムーブメントと共にOSSを採用し始める
- 1996年頃、David Filoが開発したFilo Web ServerがApacheに置き換えられた
- 1999年頃、独自のバイナリデータファイルをMySQLデータベースに置き換えた
- 2001年頃、独自のスクリプト言語ではメンテナンス性に問題がありサードパーティー製品との連携も難しくなったため、Web用に設計されたモダンな言語に置き換える必要がでてきた
- 必要としていたもの
- 高いパフォーマンス
- 堅牢で安全な環境
- モダンな言語機能
- C/C++による拡張
- FreeBSD上での動作
- 国際化のサポート
- 低いトレーニングコスト
- PHPを選んだ理由
- Webスクリプティング向けの設計
- 高いパフォーマンス
- 巨大なオープンソースコミュニティ
- HTMLの枠組み内にコードが書ける
- インテグレーション、ライブラリ、拡張性
- IDE、デバッガ、プロファイラといったツール
Yahoo!における現在のPHP
- 開発の仕方
- サーバアーキテクチャ
- OSはFreeBSD 4.x/6.xもしくはLinux 2.6.x
- 独自のApacheエクステンション
- PHP(APC、PEAR、PECL、エクステンション)
- ロードバランサー
- アプリケーションレイアウト
- HTMLテンプレート(/usr/local/share/htdocs/*.php) - 大部分がHTMLで一部がPHP
- テンプレートヘルパー(/usr/local/share/htdocs/*.inc) - HTMLとPHPが半々
- ビジネスロジック(/usr/local/share/pear/*.inc) - 大部分がPHPで一部にHTML
- データアクセス、通信、暗号化などはC/C++
- 依存性の管理
- Light basic PHP package
- PHPはXMLパーサのみを含む最小限の構成をインストール
- デフォルトですべてのエクステンションを無効にしておく: ./configure –disable-all
- 不要な依存性を無くす
- Apacheのメモリ使用量をできるだけ少なく
- Self contained extension packages
- エクステンションはパッケージ管理ツールによって個別にインストールが可能
- エクステンション間の依存性はインストール中に解決される
- Light basic PHP package
- セキュリティ
- php.iniの設定
- 常にopen_basedirを設定し、/etc/passwd攻撃を予防
- allow_url_fopen = Offを設定し、オープンプロキシ攻撃を無効化 - 代わりにlibcurlを利用する
- display_errors = Offを設定する - ただし、log_errors = Onは設定する
- 入力値のフィルタリング
- XSSおよびSQLインジェクション - ブラウザから来るデータは決して信頼しない
- input_filterフックを使う - リクエスト毎にすべてのユーザー入力値をサニタイズする
- PECLフィルタパッケージを使う - Yahoo!のフィルタリングライブラリがベース(訳注:PHP 5.2.0以降はデフォルトでフィルタ関数として組み込まれます)
- php.iniの設定
- パフォーマンス
- オペコードキャッシュ
- 容易なパフォーマンス向上
- パース済みのPHPスクリプトを共有メモリにキャッシュ
- いくつもの実装がある
- APC(Yahoo!はこれを使用)
- Zend Performance Suite
- Turck MMCache
- カスタムPHPエクステンション
- Yahoo!では自前でエクステンションを開発している
- メリット
- 速く、最適化された実行速度
- カスタムのクライアントライブラリへのアクセス
- デメリット
- 開発手順が複雑(編集、コンパイル、リンク、デバッグ)
- 手動でのメモリ管理(およびそれに付随する問題)
- アプリケーションアーキテクチャ
- PHPのセッション機能は遅いので使わない
- 頻繁に必要となるユーザーデータ(ユーザーIDやプロフィールのタイムスタンプなど)の格納にはクッキーを使い、暗号化およびsigned formatにする
- グローバル化
- Unicode
- Yahoo!はPHPのUnicodeエクステンションに貢献している
- I18Nサポート
- Generate per intl PHP template (r3 TMT) - 社内開発したTemplate Management Tool (r3 TMT)をオープンソースで公開
- r3は、UIを異なる言語に変換・カスタマイズすることができる
- ランタイムテンプレートライブラリ
- Smarty
- Yahoo!ではあまり使われていない
- キャッシュによって実行時のオーバーヘッドは抑えられるが、皆無にはならない
- Yahoo!くらいのトラフィックだとこのオーバーヘッドがばかにならない
- オペコードキャッシュ
- オープンソースフレームワーク
- Symfony
- 最近Symfonyを使い始めた
- 開発とテストがうまく統合されている
- 共通パターンを抽出している
- 良い設計を後押しする
- そのまま使っている部分
- コアMVCアーキテクチャ
- コンフィギュレーションシステム
- ビュー層
- ユーザーセキュリティ
- 置き換えた部分
- モデル層およびORマッピング - Yahoo!のニーズにはスケールしなかったため
- コンフィギュレーションシステム(の拡張) - よりフレキシブルにし、国際化をサポート
- 国際化 - r3 TMTと統合
- 採用しているサービス
- Drupal
- 利用方法の調査を継続中
- 素晴らしいアプリケーションフレームワーク
- まだYahoo!の実サービスではテストしていない
- Symfony
- Yahoo! Developer Network
- PHP Developer Center
- Yahoo!のWebサービスをPHPで使う
- HOWTO記事やサンプルコード
- 活発なコミュニティ
- PHP Developer Center
- サーバアーキテクチャ

Do You PHP はてな, May 26th, 2007 at 17:03 [Trackback]
[PHP]PHP at Yahoo!…
via.おぎろぐはてな - PHPDay 2007 での ”PHP at Yahoo!” のプレゼン 先日の勉強会ではどうもでした :-) PHPDay 2007のプレゼン資料に関する情報です。Apacheには独自パッチがかなり当てられている…
PHP-5.2.3, June 1st, 2007 at 09:44 [Pingback]
[...] 出ました。HTTP_RAW_POST_DATAが消える不具合は解消されたようです。 [...]