PHP at Yahoo - PHPカンファレンス2007

Yahoo! JAPANについて

  • 2007/7月 1日13億3800万PV
  • 月間アクティブ約2000万ID

YahooとPHPの関係

PHPコミュへの貢献

  • 機能追加や拡張モジュールのcontribute
  • バグレポート、改修
  • www.php.net(公式ミラー)のサーバ提供

PHP採用までの流れとオープンソース

  • Yahoo!Incは1994年スタート
  • 当初は独自のC/C++ソフトウェアで構成
  • 1996
    • webサーバーを独自からApache
  • 1999
    • フラットファイルからMySQL
  • 2003
    • 初めてPHPのサービスがリリース

OSS以外の利用

  • Oracle
  • OSSにもパッチ
  • 独自技術も豊富

OSSx独自ソフトウェア

日本では

  • 構成はIncと基本的に同じ
  • 2004年頃からPHPに切り替えを開始
  • 現時点ではフロントエンドはほぼPHP
    • 一部はApacheコンテンツハンドラ

PHPを選択した流れ

  • 2001年10月 3つの独自言語(→yScript)
  • 新しいものを採用するため調査を実施
    • 昨日やパフォーマンスを比較
  • 2002年5月にPHPを選択

拳固を選択するための条件

  • 高いパフォーマンス
  • 堅牢で亜安全な環境 (sand-boxed)
  • C/C++による拡張
  • FreeBSD上での動作
  • 動的コンパイル言語
  • 国際化をサポート

なぜPHPを選択したか

  • Webスクリプティング向けにデザイン
  • 高いパフォーマンス
  • 大きなOSSコミュ
  • ライブラリの充実、拡張性
  • ツールが充実 IDE デバッガ プロファイラ
  • レーニングコストが低い

レーニングコストの低さが大事

  • PHPは敷居が低い
    • もともと使える人が多い
  • PHPを使うのはプログラマだけではない
    • HTML・CSSと、ちょっとPHPを書く人とか

依存関係の管理

  • PHPは必要最低限でビルド
  • 拡張モジュールは共有モジュールとしてビルド
  • PHP本体とは別にインストール
  • 依存関係のあるパッケージはインストール時にあわせてインストール
  • 共有ライブラリにすることで
    • 不必要な依存を避ける
    • メモリ利用料を下げる
    • 構成変更で再コンパイルが不要
    • x 起動時に若干オーバーヘッド
  • Yahooでは多種多様のサービスがあり、最大公約数的な環境というものは作れない
  • ベースを用意し、ニーズに合わせてパーツを選択、最適な環境を組み立てる

PHP5

  • PHP4の終了アナウンス
  • Yahooも今年でPHP4は終了
  • 現在4.4系と5.1・5.2が混在
  • 日本では現時点でメインが4.4系
  • 2007年末までに5系へ移行する

セキュリティ

  • セキュリティ規則、開発ルールによる予防
    • 個人情報の取り扱いルール
    • 実装方法の指定
    • 脆弱性スキャナによるチェック
    • チェックリストでのリリース前確認
  • プラットフォームの整備
    • フィルタ拡張などの機能提供
    • フェイルセーフの支店からの標準設定

Scanmus

  • Yahoo!社内で開発されたXSS調査ツール

php.ini設定

  • open_basedirを設定
    • /etc/passwd読み取りなどの攻撃を避ける
  • allow_url_fopen, allow_url_include = off
    • リモートファイルインクルード、オープンプロキシ攻撃を避ける
    • libcurlを代わりに使用
  • safe_mode = off
  • display_errors = off
    • エラーをブラウザ画面に表示しない
    • ただしlog_errors = on でエラーはログに残す
  • error_reporting = E_ALL
    • すべてエラーと警告を出力

ユーザー入力のフィルタリング

フィルタ拡張

  • filter_default = special_chars
  • 必要な場合に限り、適切なフィルタを使ってfilter_input, filter_input_array関数でデータを取得
  • filter_input関数でのデータ取得例
  • 何処でどのフィルタでデータを取得しているか、ソースの検索がしやすい
  • $body = filter_input(INPUT_POST, 'body', FILTER_SANITIZE_STRING);
  • フィルタ拡張は万能ではない
  • たとえば、stringやspecial_charsフィルタは、属性インジェクションに無力

CSRF(XSRF)脆弱性対策

  • 投稿や削除などの処理のURLにユーザを誘導し、意図しないコマンドを実行させる攻撃
  • Crumbを利用する
    • 入力ページや確認ページで、ユーザ固有のダイジェストを作る

パフォーマンス

Opcode Cacheの利用

  • PHPは実行時にスクリプト中間言語に変換してから実行する
  • 解析したopcodeを共有メモリにキャッシュ
  • 各種キャッシュモジュール
  • YahooではAPCを採用
    • 安定し、よく検証されている
    • RasmusがAPCの開発に携わっている点も大きい

プロファイラ・デバッガ

  • xdebugをメインで利用
  • WinCacheGrindやKCacheGrindで可視化

PHPエクステンションの利用

  • C/C++で書いてPHPに機能を組み込む
  • Yでは社内で医療するエクステンションを開発している
  • メリット
    • 高速に動作する
    • C/C++ライブラリへアクセスできる
  • デメリット
    • 開発が面倒(コーディング→コンパイル→etc...)
    • メモリリーク、リソースリークなどの問題
    • 書き方わらかなかったり、間違えていたり

PHP埋め込み

  • webアプリではないけど
  • C/C++言語のアプリケーションにPHPを埋め込む
  • PHPの柔軟さ、手軽さをCのアプリにも

セッションの利用を避ける

  • 基本ステートレスで構築
  • Cookieを利用し、よく利用するデータを暗号化、署名をしたフォーマットで格納する
  • 画面繊維に必要なデータはPOSTで引き継ぐ
    • CSRF対策にはcrumbを利用

Yahoo!Incの国際化対応

国際化(i18n)対応

  • テンプレート管理ツールr3を開発
    • 「テンプレートエンジン」ではない
  • 地域ごとのPHPテンプレートを生成

r3

フレームワークCMS

Smarty

  • SmartyYahoo!では推奨されていない
  • 実行時にかかるオーバーヘッドがある

symfony

symfonyの導入

CakePHP

  • 評価中の模様
  • プロダクションへの投入はされていない(予定もなし)

まとめ

  • Y!がPHPを採用して5年
  • いろいろカスタマイズして使っています
  • PHP Extensionを多用
    • セキュリティ対策
    • パフォーマンスチューン
  • フレームワークは今はあまり使ってない
  • 一部symfonyを使ってます