PHPの今とこれから2007 - PHPカンファレンス2007

Netcraft調査の言語シェア

  • PHP 34%
  • ASP 21%
  • その他 0%
  • 不明 43%

PHPのバージョンの変遷

主に使っているPHPのバージョンを会場に質問

  • PHP5の方が若干多め

PHPカンファレンスアンケート結果

PHP5への移行

  • PHP4のサポートは今年限り
  • PHP 4.3/4.4で75%(Nexen.net) 4.3が28%, 4.4が46%
  • GO PHP5

PHP4→PHP5以降のポイント

  • クラスに関係する部分は変更用
  • E_STRICTによる構文互換性チェック
  • ZendEngine1互換モード

zend.ze1_compatibility_mode=Off

  • 一部の関数の処理が非互換

PHP5.2

  • stat,implode,str_replace,シャットダウンの高速化
  • filter,zip,jsonエクステンション
  • Win32 Apache2.2対応

PHP5.3

  • 2008/1リリース?
  • PHP6までのつなぎ
  • ICUエクステンション:pecl/intl
  • OpenSSLエクステンションにOpenIDサポート追加
  • (名前空間)?

PHP 5.1/PHP 5.2の高速化

  • PHP 5.1/5.2 ZendEngine大幅に高速化
  • PHP 5.2 メモリしよう効率化

ベンチマーク見るとかなり速くなってる。

PHPとセキュリティ

  • Stefan Esser市が主宰
  • PHPのセキュリティ強化パッチ Suhosin
  • the Month of PHP Bugs (MOPB)? http://www.php-security.org/
    • PHPコアジェイじゃ区政、POCコード公開(ドイツの法律で禁止?)

PEAR/PECL update

PHP 6.0

  • Unicodeネイティブ対応
  • レガシーコード削除
  • エクステンション
  • 機能追加・改良

MySQL ND

  • DB I/Fをネイティブ実装 (libmysqlを使わない)
  • DB I/FをPHPから管理可能:メモリ管理、キャッシュなど
  • 使用メモリを低減、高速化
  • PHP5/PHP6をサポート:PHP6に標準バンドル(PHP 5.3にも...?)

Cycle collector

  • 現在はシンプルなガーベッジコレクタを実装
  • David Wang氏が「Google Summer of Code」で課題に
    • リファレンスカウンティング+サイクル検知
  • ez Componentsを使ったベンチマーク
    • メモリ消費量は1/2〜1/22に。実行時間は拡大
  • PHP6.0に採用予定。PHP5.3にも採用?

Namespace 名前空間

  • 多分5.3か6.0に入ってくる

PHP 6.0のUnicode対応

課題:PHP6と日本語

ーPHP6ではmbstringの機能の多くがネイティブ実装化
ー日本語対応は十分か?
ー(入力)文字コード検出は?

  • mbstringは不要になるか?

PHP6のデモ

  • Unicodeモードon/offで結果が変わるデモ

PHPプレゼンシステムがイイ。上にPHPコード、下に実行結果。

質疑応答

  • PHP6でみんなUnicode使う?
    • 英語圏はoffかも
    • 数年間は使われないかも。

大規模サービスの開発・運用 ウノウ編 - PHPカンファレンス2007

ウノウ株式会社 尾藤正人さん

  • ウノウはそんなに大規模じゃないよ(笑)
  • 大規模とはいえないけど。。。

サービスの開発・運用

  • ウノウの紹介
  • コンシューマ向けWebサービスの開発
  • BtoC
  • サービスいろいろ
  • エムエルじゃないよメーリスだよ
  • 社員30人

サーバをたてる

自社サーバ
  • 小規模or大規模
  • 空調
  • 場所
  • 引っ越し

いろいろ面倒。

レンタルサーバ
  • メリット
  • デメリット
    • 拡張しづらい
ホスティング
  • 中規模or大規模
  • メリット
    • 自由度が高い
    • 設備が充実
    • 安心
  • デメリット
    • 高い
ウノウは?
  • 自社サーバ and レンタルサーバ
  • ベンチャー流サーバ構築のすすめ(ハードウェア編)→はてぶ沢山
    • ハードウェアを統一
    • 構成を全部同じにしておくと、代替がききやすい
    • フツーの筐体マシン
    • エレクタに格納
    • 後ろ向きで並べる

写真

    • マジックテープでケーブルをまとめる
    • 養生テープ(引っ越し屋さんが使ってるテープ。はがしやすい。メモも書ける)
    • 色違いのLANケーブル
    • LANケーブルに長さを書いたラベルをつける
  • ネットワーク
    • 2回線以上引く
    • DNSを内側において回線を自動的に切り替える
    • グローバルにプロキシサーバを置いてリバースプロキシで。グローバルIPはそんなに沢山もらえないから
    • ローカルにはクラスBのプライベートアドレス
    • 各サーバに恒久的な物理名
    • 役割に応じて論理名をつける
  • ソフトウェア
    • OSはコピーするもの restore, dump
    • ext3
    • LVMは遅い
    • 設定ファイルはコピー(puppet良さそう)
    • 極力パッケージを使う
    • ソースからインストールするときは/optへ
  • 運用
  • セキュリティ
    • パッケージのアップデート
    • 不必要なポートをすべて閉じる(iptables)
    • あけるポート 22 ssh,25 smtp,53 DNS,80 http,443 ssl
    • ftp禁止!
    • sshパスワード認証禁止!ウノウでは完全に禁止。全部公開鍵認証で
    • rootで作業禁止!sudoで
  • トラブル対策
    • ''近くに住む''(笑)
    • メールで起きられるように鍛える(笑)
    • トラブルが起きたときのネットワークの確認順序 ping ssh HTTP
    • 状態確認 top vmstat netstat ifconfig dmesg
    • ログの確認 /var/log/message /var/log/secure /var/log/httpd/error_log
  • アプリ側での工夫
    • スケールできるように
    • セッションはDBに。PEAR::HTTP_Session使うとけっこう簡単にできる
    • 更新系クエリと参照系クエリを分ける
    • JOINは使わない。DB分割できるように 注:Cakeで解決!
    • コードキャッシュ XCache, eAccerelator
    • コード最適化 Zend Optimizer
    • プロファイラ xdebug
    • ベンチマーク PEAR::Benchmark

サービスの始め方

  • 小さく始める
  • 1〜2人 1台
  • 短期間で公開 1,2ヶ月が目安
  • ユーザの反応を見つつ少しずつ拡張する
  • 時には大きな方向転換、時にはあきらめ

大規模サービスの開発・運用 GREE編 - PHPカンファレンス2007

グリー株式会社 藤本真樹さん

GREEの昔

  • PV 50万
  • ユーザー数 10〜20万
  • サーバー 8台
  • ソースコード 400files
  • 開発チーム 1.5人
  • マンションの一室

GREEの現在

  • PV 6000万〜1億
  • ユーザー数 200万
  • サーバー台数 600-1000
  • ソースコード 5,300 files / 500,000 lines
  • サービス 10ぐらい
  • 開発チーム 20人くらい

ソースコードアーキテクチャ

  • frontend
  • service
  • src
  • ディレクトリ構成とか
  • 利ファクタリングは避けられないよ
  • 時世的に他言語ブリッジも考えておいたほうがいいかも

データ

  • データは増える
  • 増える速度も増える
  • DB分割
  • インデックス張る
    • slow-logをみてEXPLAINしてみたり
  • キャッシュ
    • データキャッシュ
      • キャッシュストレージはMemcache, Mysql
      • ウノウでMemcacheで最近苦労している。Memcacheサーバーの足し引きめんどい
    • スマートキャッシュ(書きながら命名
      • 更新時にデータを更新
      • イベントハンドらみたいな感じで
  • TEXTフィールドを別DBに分割(効く)
  • テーブル分離 (JOINしない)

サーバ構築/運用

  • 500台になるとさすがに厳しい
  • Debian GNU?Linux完全依存
  • 全部aptパッケージ管理
  • つまり
  • サーバー増えてくると管理ツールっぽいものが必須になってくる
  • でもツールは意外に無い
  • 多少の犠牲を払ってでもサーバOSとかは一律でそろえたほうが楽

開発/リリース環境

  • 開発環境
  • 10人
  • svn upしたら 10分まちとか

根幹システム/ライブラリ

  • RDBMS
    • MySQL Clusterとかちょっとまだきつい
  • PEARのHTTP_Requestはバグバグで独自HTTPローダ ← 確かにバグバグ
  • ApacheモジュールでQRコード生成
  • Smarty遅い
  • 全文検索 Senna (Sennaちょっとどうよ?そんなにデー多数多くなければいいかも)

質問タイム

  • deployどうしてるのか

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を使ってます

LT モバイル開発におけるPHPの利用方法とTIPS - PHPカンファレンス2007

  • HN: memokami http://memokami.com
  • ケータイサービスを主軸においてやってます。
  • ケータイサイトとPCサイトの違い
    • もろもろ
  • キャリア判別
  • PEAR::Net_UserAgent_Mobile
    • キャリアとれる
    • 端末タイプも取れる
    • 画面サイズも取れる
  • 文字コード
  • 内部文字コードEUCを使ってたりすることも。
  • php.iniで文字コード変換の処理を行う
  • sjis-win, eucjp-winを利用する
  • 絵文字
    • hackhack
  • セッション
    • Cookie使えないよ
    • URLでセッションID渡すしかない
  • 続きは9/17 第2回モバイル勉強会で

LT PHPを画像を処理 - PHPカンファレンス2007

  • 画像操作をするとモテる?w
  • デザイナ女性多い
  • 画像操作でモテモテ
  • レンタルサーバーだとGD
  • PHP4だと magickWandForPHPがおすすめ
  • php5だと imagick2がおすすめ
  • ライブラリとか敷居高かったりポリシーあったりするからBlogにコード書こうぜ