PHP Conference 2013 に行ってきました。

http://phpcon.php.gr.jp/w/2013/

【主な収穫】

 

━━━ 以下、雑なログ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━

≪ミッションクリティカルなシステムの勘所≫
広告配信システム
・リアルタイムレポート
・膨大な配信ボリューム
・無停止メンテナンス
・柔軟な改修

・インフラ
  ほぼAWS
  富豪構成:Multi Load Balancer、Multi-Datacenter、Multi-Server
  多数のインフラを手動構築では危険
  Stack Deploymentパターン
    CloudFormation
    テンプレート+CLIの利用で柔軟に
    点プレから変更が少ないネットワーク部分を構築
    次にCLIでネットワーク上に置く変更の激しいものを設置
      

・アプリケーション
  広告配信はScala:Servlet
  計測部分はPHP+Gouche
  管理画面はPHP+Symfony2
  
  ‐テストコード
  ‐Pull Request運用
  ‐CI
  ‐ワンクリックデプロイ
  ‐本番同等検証環境完備
  
  サービス停止がまずい
    配信できない
    計測できない
      ぼっちで動く:連携システムが落ちても単体で動く。多少情報が古くても動かす。
      レスポンスを速攻で返すために:
        レスポンスだけ先に返す  ⇒  取り込みは裏バッチで。Fluentd
        か所によってはPHPをやめる  ⇒  PHP→Scalaで3倍速く。
        富豪的に解決  ⇒  スケールアウト+スケールアップ
      自動リトライ機能で運用を楽に。

・モニタリング
  fluentdでログ収集
  GrouthForecast:グラフ事前定義不要
  Xymon
  
  手軽に計測、手軽に関し、足らんなら作って公開

PHPはどのような部分に?
  どこでも。あなたがそれが良い選択だと評価できるならば。
  自分たちで検討して、動かして、計測して、評価する。
  
≪Composer≫
ライブラリはPackagistで探す。https://packagist.org/
VersionUP,Downも自在に。
PEARもインストールできる。
autoload.phpだけをrequireすれば二度とrequire_onceを呼ぶ必要がない。
  使う必要が出てきたタイミングで必要なものをLoadしてくれる。
  ライブラリごとのファイル名規則など把握する必要なし。
  
  PSRを守っていれば自作クラスでもautoloadされる。


≪パフォーマンスが悪い実装≫
・DB接続のキャッシュ
  __construct()でオープン
  __destruct()でクローズ
  とか。
  
  Apache child process (MINITとか)を理解して改善する。
  
・大量のdefine
  コストが大きく、リクエストごとに実行される。
  phpのextensionに記載すると改善できる。
  extensionが使えないか環境なら、hidefを活用するのが良い。
  
  
・ホスト名取得(exec)
  execによるプロセスの生成コストは非常に大きい
  Preforkの設計努力が無駄に。
  PHP5.3移行でサポートされたgethostname()を使いましょう。

・PFテストは継続的に
  ツールでサポートして促しましょう。
  Jenkinsでパフォーマンステストを自動実行して可視化するとか。

≪PHPからTwilioで電話を掛ける≫
・アメリカのサービスをKDDIが展開
  http://twilio.kddi-web.com/

・電話API
  電話発信、受信API(050番号取得)
  ダイヤル操作、録音などなど
・SMS
・VoIP連携

・初期費用が低く、スモールスタートでも使える。
・手順
  電話番号を買う。
  電話がかかってきたときにPOSTされるURLが発行される。
  
・既存サービスに付加価値をつけるのがフィットしている
  匿名通話
    電話番号を交換せずに。
  他者間通話
    海外からの電話に通訳をクラウドソーシングで入れる。
  電話受付
    かかってきた番号を記録して、後からかけなおしますと案内
  2要素認証
    ID/PASSと、自分の電話にSMSでコード送信

・利点
  Webサーバ連携が簡単
  1つの電話番号で同時着信可能
  電話番号でユーザ識別可能

・セキュリティ
  ほんとにTwillioサーバからのリクエストかを判別必要がある。
  サイトのドキュメントにその説明がある。
  署名の付加など。SSL証明書が必要。自己証明書ではできない。
  SMSにURLなど含めるとフィルタされる可能性あり。(au)
  SMSで迷惑メール設定などで届かない可能性あり


≪MySQL admin≫
・4.0から5.6への移行について
  Slaveから。
  mysql_upgradeで。
  mysqldumpで。

・スケールアップ
  INSERT/DELETEが重いときはパーティショニングが有効。
    パーティショニングキーを指定しないとSELECTは早くならない。
  SELECT、UPDATEが重いときはインデックスやパラメータが原因

・SQLレビュー
  今よりレコード件数が増えても想定のインデックスが使われることを考える。
  DEPENDENT SUBQUERY, type ALL, Using temporary table, using file sort 辺りは
  件数が増えると重くなる。

  テストデータの件数と分布も大事。

・外部キー制約
  嫌いな人が多い。パフォーマンスには影響ないので使いましょう。

・遅いクエリ
  相関サブクエリを使っている。
    CPU使用率が跳ね上がったらこのパターンを疑う。
  インデックスが足りない
    重いクエリーには複合インデックス
      ANDの条件を順番に並べる。それにORDERBYで使われているカラムを足す。
      不等号とかORを使うと、ORDERBYまで波及しない。
      LIMIT使ってるならWHEREよりもORDERBYを狙ったインデックスのほうが改善できるケースもある。
  パラメータ中忍具
    innodb_buffer_pool_sizeはデータ格納寮歌搭載メモリーの75%くらい突っ込む。
    MyISAMと同居するとメモリを取り合うので別にする。
    SSDなどの場合はパラメータチューニング
  
  クエリチューニング
    スロークエリに乗らないクエリもいろいろすると拾える。
    EXPLAINは基本。
    KEYが使われてるか、key lengthが想定している長さで使われているか。
    (int, datetime, varchar(32))なのにkey lengthが4とかだと、intのキーしか聞いていない。
    Using file sortは意外と重い。ORDER BYをIndexを狙う。
    
    
≪Vagrant≫
Vagrant入門ガイドが電子書籍で出た。Kindle。Gihyo Digital Pulishing.
関西PHP祭りで使った入門セッションのスライドがスライドシェアーに。
・用語
  Boxファイル     ⇒  マシンイメージファイル
  Vagrantfile     ⇒  仮想マシン構築設定
  vagrantコマンド ⇒  全ての操作

・PHP開発環境を構築
  流れ:
    $ git clone repos
    $ vagrant up
    完了

  Gitで管理
    Vagrantfileはプロジェクトごと
    ソースと一緒にGitで管理
    .vagrantは.gitignoreへ
  
  vagrant up
    仮想マシン構築、起動、OS起動
        構築
        Boxファイル名
        IPアドレス(ホストPCないだけのもの)
        ポートフォワード
      プロバイダ
        VirtualBoxの設定
        
    ミドルウェアインストール
      まずはシェルでやりましょう。
      php.ini, httpd.confは用意しておいてコピー。
      
    DB構築、データ投入
    アプリケーションデプロイ
    

・クラウド環境を構築
  AWSへも同じ環境を作成可能

・Vagrantが見せる夢
  Projectごとに独立した環境
  CIサーバにも使える。
  いつでも構築できる安心感。

≪WebAPI≫
・地図アプリAPIゼンリンデータコム)
  混雑状況、エリアの指定人数をリアルタイム表示

・駅データ.jp
  例)鉄道アラーム:乗り過ごし防止。
  
・Dropbox
  Dropboxへの送信をAPIで。

・WebPay
  クレジットカード決済

≪Phpstorm≫
・最初から高機能
・コード保管
  ・静的解析が優秀
  ・ライブラリや自作クラスも補完
・Symfony2、CakeStormなどのプラグイン
・Ctrl+Shift+AでFind Action、Jump to Class/File, Go to Decralation, Recent File
・自動アップロード、branch変更時も自動で, 
・Local history
・Bookmark
・リモートデバッグ
・LiveEdit

≪プロファイラ≫
・New Relic
  SaaS型パフォーマンス管理ツール
  お手軽。有償。フリートライアル有。

・xhprof
  facebookの人が作成。
  処理のフローをグラフ化。
  xhprof_enable()をbootstrap前に。
    /tmpのボリューム
    インストールが面倒
    詳細な情報がない。

・PHP Quick profiler
  ProfilerLog

≪PHPコアから読み解く定石の嘘ホント≫
・エラー演算子”@”のあるなし
  結果⇒エラーが起きるケースで比較すると、ある場合のほうが早い。
        error_reporting をクリアする処理が入るが、
        エラーログの出力などの処理の分の差が出る。

・比較演算子 == or ===
  === のほうが倍早い。===は方が違えばその場で処理終了。
  == は型変換がある。型が同じ変数の比較なら差が出ない。

・print / echo
  ややechoが早い。printは戻り値がある。ので戻り値を返した後に、
  変数を開放するプロセスがある。
  かつ、内部でechoを使う。

参考)
http://d.hatena.ne.jp/koto2/20080518/1211070116