ぺちぱーではないのですが、php4 → php5 移行時代に使っていた事があるというだけの理由で、PHPカンファレンスに行ってきたのでメモを晒します。
当日のタイムテーブルはこちら http://phpcon.php.gr.jp/w/2012/timetable/
技評さんの写真も付いている素晴らしいレポートはこちら http://gihyo.jp/news/report/01/phpcon2012/0001
@unsoluble_sugar さんのありがたい講演資料まとめはこちら http://unsolublesugar.com/20120916/082851/
いまだからできるふつうの話 GREE 上村さん
長く続く大規模サービス基盤、の作り方にフォーカスして話す
そもそも大規模とは
- データ的に50億レコードあるとか
- トランザクション的に100万トランザクション/secとか
ポイント
- 最初から大きくあることがわかっているテーブルは、あらかじめ分割して別々のサーバに置く => あとから分割するのは難しい
- 購入履歴 => 日付毎のテーブル
- 所持カードのリスト => ユーザIDでmodとって100分割
よくやる解決法
- スレーブ増やす
- スケールアップ(メモリ増やす、Fusion-io使う)
- クエリチューニング(covering index, index full scan)
実際のチューニング(1)
- 月に数回 slow query が発生してレプリケーション遅延が発生していた
- DBのサイズは10GB強
- MyISAM -> InnoDB
- メモリ 16GB -> 24GB
- slaveを6台 -> 3台に縮小
- 課題:サービスを止めずに alter しないといけない
オンサービスでのDBきりかえ
- 現行 master の slave として、新セットの master/slave をつける
- レプリケーションできる形で alter しておく
- slave を新セットの slave におきかえる
- master の切り替えのために、auto_increment をあげる。# id 指定で insert しておく
- あげておかないと2重 master からのレプリケーションで slave で衝突する
結果
- 新セットへの切り替えのみですべての問題が解決
- クエリのチューニング計画は空振り orz
実際のチューニング(2)
- バッチの処理が遅くなって来ている
- レプリケーション遅延が頻発
- 4000/sec のupdate 文が飛んでいた
- in 句で50件ずつまとめて更新するようにした
- 簡単な対応だけど効果がすごく大きかった
- 大昔のコードにこういうのがあって、いきなり火を噴くことがある
<継続>
- よりよいシステムを作る => 完璧なシステムを作る? => 間違い
- 完璧=その時点での完璧。環境は変化する。
GREE7年間のアーキテクチャ変遷
2005
- Ethna 利用
- Action(Controller), View, Manager(Model)
- DBI master/slaveを選択
2006
- serviceを追加
- DAO: データ変換、分割DB対応、SQL動的生成
2007
- serviceがservice層に。釣りスタサービス
- Generic DAO 多様な分割DB対応、SQL動的生成廃止、チューニングが必要だから
2011 激動
- Aoi カスケード(社内フレームワーク)
- Service と Manager 併用という状況の打破。
- Cascade(Generic DAOの拡張) より厳密な型変換。
- KVS ドライバ(同じインターフェースで mamcache, flare にアクセス。flare とは gree内製の KVS
- Service -> Processor (1つの機能) -> Module (Managerに相当)
- => DataAccessor (DAO) => Cascade
- => Legacy Module => (Manager, Service) Adapterパターンでレガシー関数をModuleインターフェースに変えている
Ethna
- 2005年から変わらずに存在する
- 機能自体には目新しいものはない。認証。ルーティング。バリデーション。
- すごく良くはないけど、とくに困らない。
DOA -> SOA
- 2005年 DOA Data Oriented Architecture
- 2007年 SOA Serivce Oriented Architecture
- サービスの種類が増え、データの扱い方という単位でサービスを表現できなくなった
- manager -> service -> Aoi/cascade に段階的に移行したから、できた。
- 段階的(少しずつ)なので、失敗したら戻せる
安定運用
- 監視と障害対応
- 監視。定期的にGangliaのグラフを確認。深夜のアラートは担当者の電話が鳴る
- pull request のレビューを重要度に合わせてエスカレーション
- デプロイのサイクルを短く。個別は毎日
お知らせ
- github.com/gree
- Cascade, LWF オープンソース化
まとめ
GREEの変遷はわかった。
安全なPHPアプリ開発の鉄則 徳丸ひろし
鉄則1:php の脆弱性
- 脆弱性報告を読もう
- is_a メソッドに文字列を渡すと何故か autoload が呼ばれるという脆弱性
鉄則2:ajaxの脆弱性
- ブラウザ側でエスケープ vs phpコードでエスケープ。どっちでもいいけどやろうね
- JSON解釈をevalでやる、と怪しい。jQueryに任せるのが楽
- X-Content-Type-Options: nosniff を入れないとIE9だと json.php/a.html がHTMLと解釈される脆弱性。IE7だとダメ。
- IE6, 7 用には <> をユニコードエンコードして、エスケープしてあげること
JSONハイジャック
- JSONを罠サイトからscript要素で読み出す
- 利用者のブラウザからは、正規のcookieが送信されるので、認証済みの状態でJSONが取得できる
- Firefox11.0だと問題なし。Android標準ブラウザでは動いてしまう。Android4.0.3では動かない。
鉄則3:競合条件(排他制御)の脆弱性対処をしよう
- ドリランド。カード増殖
- トレードの時に、A さんが B, C さんにトレード。select して insert (相手) して delete (自分)。これで2個に insert できていた。
- 鳥ランドwwwでデモ
排他制御が必要
- transaction + 行ロック (SELECT FOR UPDATE)
まとめ
徳丸本読んで勉強してね
xdebug @anatoo アシアル
xdebugの使い方ではなくて、裏側の仕組みを説明。Monacaとか作ってました。
xdebugを調べてみたら、phpの裏側の仕組みと連携していて、へー、と思ったので紹介
xdebugとは?
- デバッグや開発を支援してくれる
- コードカバレッジ取得
- 関数とレース
- リモートでバッグ
- プロファイル
コードカバレッジ機能
- 実際に実行した行を調べる。テストの網羅率を調べるのに使う。
- xdebug_start_code_coverage(); をファイル頭で呼ぶ。#めんどいね
- PHPはどのようにコードを解釈して実行される?
- 字句解析
- 構文解析 (bison)
- コンパイル(Zend Engine)
- 実行
コンパイル zend_op_array 構造体を作る
- zend_op 構造体
- ZendEngine への命令を表現
- ZEND_NOP_ZEND_ADD
- ZEND_SUB
- などなど
実行 (zend_execute関数)
- zend_op 構造体を解釈し実行
- xdebug.c 588行目あたりの初期化コードでなにかオーバーライドしている
- ZendEngine の振る舞いを拡張ライブラリから変更できるAPI zend_set_user_opcode_handler
- 実行時の行を保持するようにオーバーライドしている
関数トレース機能
- zend_execute 関数をすげ変えてフックを追加
- zend_execute は関数ポインタ。拡張ライブラリも書き換え可能。
- xdebug_old_execute = zend_execute;
- zend_execute = xdebug_execute;
リモートデバッグ機能
- ブレークポイント、ステップ実行。MacGDB と PHP で通信。
- DBGPプロトコルで通信
- DBGPデバッガ(MacGDB)がソケットをlisten. デバッガ(php + xdebug) が接続
- xdebugが止まっている間は命令待ち。DBGPデバッガがデバッガに命令
- statement_handler. すべての構文の実行ごとに呼び出されるフック。xdebugはここでブレーク
- xdebug_dbgp_breakpoint ブレークポイントの実装
まとめ
- PHPの中にはフックできるところがたくさん
- 「へー」と思ってもらえたらうれしい
感想
- 「へー」と思いました!面白かった
Git x Pull Request ~ チーム開発最終奥義 @sotarok
Crocos という会社をたちあげました。http://blog.livedoor.jp/kensuu/archives/54119909.html
Git 移行について考える
- git に移行するkとは、svn に対応するコマンドを覚えることではない
- git を最大活用できる開発フロー、業務フローに変えていくこと
git の活用とは
- ローカルコミット
- 気軽にブランチを切る
- これを生かしたブランチ戦略!
git のブランチ戦略
- A Successful Git Branching Model ベストプラクティスのひとつ
- Crocos ではこれをカスタマイズしたものを使っている
A Successful Git Branching Model の説明
- master 常に、最新の安定したソースコードが手に入るブランチ。リリースブランチ
- develop masterから分岐した日々の開発を行うブランチ
- release リリース前の確認を行う必要があれば修正する。本番リリース前のテスト、確認作業。developはdevelopで使えるようにdevelopからブランチ切っておく。日々のプロセスと、リリースプロセスを平行にできるようにするため。
- feature 機能追加はdevelopブランチから分岐して開発。その機能はまだリリースに追加しない、となった場合はdevelopにマージしない
- hotfix developの完成を待たずに緊急修正。masterからhotfixブランチを切る。必要になったときに考えれば思いつくのでいいや。
ツール
- git-flow Successful Branch に準拠したものを簡単にできます。
- git-daily Crocosの運用ルールに則って作ったもの
git-daily
- pearでインストールできます
- いちいちタグつけない
- いちいちバージョン番号つけない。Webでバージョンなんていちいちみないよね、という理論。
pull request の話
他の人の責任範囲に対して、変更が必要な場合
- 依頼タイプ。コミュニケーション不足で違う物が作られたり
- コピーして独自改造タイプ
- 勝手に変更タイプ(勝手にcommit)
- !pull requestタイプ
pull request タイプ
- パッチを書いて、取り込んでもらうことを依頼
ブランチ戦略に pull request を組み込む
- feature ブランチを develop に入れる際に、pull request を送る
- pull request 毎にレビューする
- 変更の context が明確なため、レビューが超効果的
pull request のよいところ
- パッチのやりとりが可視化され、オープンで記録が残る
- リファクタの機械が与えられる
システム
- GitHub 落ちてるとリリースできなくなっちゃうよね
- GitHub Enterprise
- GitLab クローンだけど、バグある。。。
クロコスでの事例
- feture ブランチから、pull request
- 多段 feature ブランチ
- 大きな feature ブランチの場合は、レビューのしやすい粒度で、さらに切ってレビュー
効果
- 自分の担当以外の部分の実装・仕様の把握ができるようになる
- お互いに、だれがどういうコードを書くのかをわかるようになる
うまくいくコツ
- できるだけ細かくリリース
- 小さめのチームに分割する # どういう意味かわからなかった。小さくしたら担当(チーム)以外の実装がわからなくなるとおもうけど
感想
- 自分たちのチームのやり方とあまり変わらなかった
- ので、違う所として git-daily にもう少しふみこんでほしかったなぁ
PHP 5.5 新機能 Generator 初心者入門
目的:generator ってなんだかすごそうだ、と思ってもらう
generatorとは
- 関数の一時中断、再開ができる = セーブ機能
- generator 関数
- generator オブジェクト = セーブデータ
- yield 分 = セーブポイント
yield を使った関数を generator 関数と呼ぶ
function gfunc() { $i = 0; yield $i; // 1回目呼び出しでの return $i++; yeild $i; // 2回目呼び出しでの return $i++; yeild $i; // 3回目呼び出しでの return }
generator関数は使い方が違う。
$g = gfunc(); // generatorオブジェクトが作られる。 foreach ($g as $x) { イテレータとして使ってはじめて実行される }
generator でなにがうれしいの?
- 汎用性の高いループ処理を generator 関数にして、ex) each_line
- 汎用性の低いループ内処理だけ、別ループで書く foreach (each_line($filename) as $line)
もっと generator
- generator 関数の引数を generator オブジェクトにして、generator を重ねる、なんてこともできる.
途中退室><
フレームワークアップデート
各フレームワークの有識者による最新情報のショートプレゼンセッションです。
- CakePHP2
- Symfony
- FuelPHP
- Yii Framework
- BEAR.Sunday
8分でわかる最近のCakePHP @shin1x1
今のCakePHPは?
- CakePHP2.2.2
- PHP5.2.8以上
- フレームワークをリファクタリング
- lazy loading によるパフォーマンス改善
- PHPUnit
いまどきのコントローラ
- ファイル名とコントローラクラス名が同じに
CakePHP2.2の新機能
- ビューブロック、継承
- Event System (Dispatcher Filters) オブサーバパターン
- Hash
- ModelValidator
次のCakePHP
- 2.2.3 が10月予定
- CakePHP3 も発表済み
CakePHP3
- PHP5.4以上
- Modelが連想配列ではなく、オブジェクトを返す
まとめ
- これから使うから CakePHP2.2.2
- オフィシャルのオンラインドキュメント cakephp cookbook が大変便利です
- CakePHP2実践入門 2012/09/29発売!
Symfony 株式界社エイチーム
Symfony リリース状況
- 2.1 が最新
2.0 から 2.1 への変更
- パッケージ管理が composer に。bin/vendors スクリプトはかかなくなった。
- composer http://www.ryuzee.com/contents/blog/5681
FuelPHP
発音
- まさかの2大派閥
- フューエル
- ふえる(日本)
イメージ
- Symfony は野球, クラシック
- CakePHP はサッカー, ジャズ
- FulePHP は散歩, アニソン
- アニソン好きが1人で使う手軽なフレームワーク
今
- ユーザが急増
- 最も注目されている次世代フレームワーク
特徴
- 規約より設定
- ゆるい制約
- コアを改造することも容易
- オレオレ化もオK
課題
- PostgreSQL非標準
業務での実績
- 小規模開発only
転職市場
- Symphony: 7件
- CakePHP: 6件
- FuelPHP: 0件
Yii @crifff
- CodeIgniter から yii にいこうか fuel にいこうかという時代もあったが、
- fuel にダブルスコアでまけている
- 中国、ロシアで流行っている気がする
- 他のフレームワークから良い所どりした洗練されたフレームワーク
yii 2.0
- PHP5.3.8
- composer によるパッケージ管理
- リリースは未定
BEAR.Sunday
特徴
- API Driven Framework
- Web API を内部でも使う
Hypertext-Driven API
- Hypertext じゃないと REST とはなのっていけない
- Hypertext-Driven? = 情報がつながっている
- OPTIONS メソッドで、どのメソッドとどのパラメータが使えるのかが分かる
- HAL http://stateless.co/hal_specification.html