雨ブロ【yusukixsのブログ】

アドテク関連の業界で働くエンジニアです。最近はKubernetesでコンテナクラスタを構築してサービス開発することに力を入れてます。

PHPカンファレンス2015に参加してきました

私が携わっている開発プロジェクトでPHPを使い始めて2年ほど。 最近はかなり使いこなれて、開発スピードもJavaに比べて速くなったように思います。

ということで、PHPの最新情報や活用法を取得してくるという目的で、10/3(土)に開催されたPHPカンファレンス2015に参加してきました。 今年はPHP生誕20周年でPHP7のリリースを控えているということで、参加者2000人以上の大規模イベントとなっていました。

PHPの今とこれから2015 廣川類(日本PHPユーザー会)

  • 今年はPHP20周年
  • 今年のテーマは「7」
    • PHP7が来月リリース

PHPとは

PHPのバージョン分布

  • 最新の5.6は3%
  • 5.5が12%
  • 5.4 31.3%
  • 5.3 38.1%
    • サポート切れの5.4以下が80%以上使われているのが現状

PHPリリースサイクル

  • リリースサイクル:1年
  • ライフライクル:3年(バグ修正:2年、セキュリティ対応:1年)
    • 5.4は2015年9月に開発終了
    • 5.5.26 OSコマンドインジェクション

PHP7.0改善のポイント

  • 大幅高速化
    • WordPress4.4のベンチマークでは、PHP7はPHP5.6よりも2倍高速
      • HHVMは3.9は更に10%高速
  • スカラー型宣言と戻り型宣言のサポート
    • デフォルト動作は従来と同じ
    • Strictモードにすると厳密な型チェックが有効になる
      • 整数型と文字列型を厳密に区別してエラーを出すようにするなど
  • 致命的エラーを例外補足可能に
    • エラーをtry / catchで取得可能
  • <=>演算子
  • パーサとコンパイラを分離
    • コード管理が容易になり、最適化・メモリ削減
  • エクステンション削除:ereg, mysql, mssql
  • SAPI削除:22種類 → 7種類
  • newオブジェクトの参照代入廃止
  • PHP4形式のコンストラクタは警告が出る
    • 将来的には廃止予定
  • エクステンションは要変更

PHPのこれから

  • PHP7.1開発が開始される
  • PCOPHP Cryptography Objects)
    • 暗号化のオブジェクトを実装するか議論中
  • JIT?

PHPの未来

  • Hack/HHVMリリースの持つ意味
    • PHP7は劇的に進化した、そしてこれからも…
  • 高性能かつ現実的な解を継続的に提供する

フリマアプリ「メルカリ」の急成長を支えるエンジニアリング 久保達彦

メルカリの提供環境について

  • インフラチーム:4人
  • 総エンジニア数:30人弱

  • イントラはさくらの専用サーバ

    • 一部はAWS
    • 全部AWSにしないのは、専用サーバはコスパが高いから
    • クラウドは突発的な負荷などに対する柔軟性が高いため、一部に利用している
  • PHPで高速なAPIサーバを実現

  • New Relicによるモニタリング

    • レスポンスタイムをグラフで可視化
    • PHP5.3から5.6にバージョンアップするとパフォーマンスが20%ほど向上

nginxの役割

  • nginxサーバにHTTPSかSPDYのリクエストがクライアントから飛んで来る
  • nginxは大量の同時接続数(数万)を軽快に捌ける
  • APIサーバのL7(HTTP)ロードバランスも兼ねる
  • 高速なHTTPS通信の提供
  • nginxはApache Solrサーバーに検索をリクエストするが、nginxは検索結果のキャッシュができるのでSolrの負荷を下げられる
  • キャッシュつきリバースプロキシとしても優秀

SlackでChatOps

  • デプロイ
  • 勤怠管理
  • アラート通知
  • CIの手動実行

Slackプロキシサーバ経由でどこからでもホスト

slackboard というプロキシサーバをGoで実装

ゼロタイムデプロイ

ngx_dynamic_upstream

プッシュ通知基盤

Gaurunというサーバーを作った

ログ分析

  • 一日ログ 200GB / day
    • 各サーバーのログをfutendで転送
  • サーバーサイドで起こるイベントを柔軟にロギングするツールを実装
    • データ集計、レポートメール、WebUIでグラフ化
    • 分析が容易になるログ基盤を一から構築した
  • Puree
  • 基本はBigQueryでアドホックに分析
  • Chartio等の分析ツールとも組み合わせて利用

まとめ

  • 色々工夫してPHPで高速なAPIサーバを実現
  • バックエンドではGoを採用する場面が増えている

いまどきのPHP開発現場 -2015年秋- 新原雅司

PhpStorm

  • JetBrains社のIDE(有償)
  • 動作が軽快、静的解析、オールインワン
  • Vimmerも納得のIdeaVIM
  • コード整形もコミット前に自動的にやってくれる

Vagrant

  • プロジェクト毎に独立した環境
  • 自動構築
  • チームで同じ環境を利用
  • 運用環境と同じ環境

Vagrant導入ポイント

  • PHPコードと一緒に管理
  • とことん自動化(vagrant upで管理)
  • プロビジョニングはVMの中で実行
  • Shell Scrpit -> Ansibleが楽

フレームワーク

Laravel

フレームワークの付き合い方

CI

Travis CI

  • GitHubとしか連携できない
  • git push / PRを検知して実行

Scrutinizer

  • コードフォーマットや静的解析のSaaS
  • 指摘表示
  • 有償ならテスト実行も可

PaaS(Heroku)

  • Platform as a Service
  • HerokuがPHPを正式サポート(2014)
  • Azure WebApps

PaaS

  • サーバセットアップは自動
  • Gitでデプロイして、すぐに使える
  • サーバメンテナンスが不要

まとめ

  • ツールやサービスに任せる
  • やるべきことに集中

PHPあるあるパフォーマンス対決 

メソッドチェーン vs 非メソッドチェーン

どっちが速い? 10万回計測

for ($i = 0; $i < $MAX; $i++) {
    $ca->testA()->testB()->testC();
}
for ($i = 0; $i < $MAX; $i++) {
    $ca->testA();
    $ca->testB();
    $ca->testC();
}

メソッドチェーンを使わない方が速い!

メソッドチェーンは、戻り値を使うために用意している一時変数の確保と解放にオーバーヘッドがかかっている

異次元配列書き込み

$list = array();
for ($i = 0; $i < $max; $i++) {
    for ($j = 0; $j < $max; $j++) {
        for ($k = 0; $k < $max; $k++) {
            $list[$i][$j][$k] = 1;
        }
    }
}
for ($i = 0; $i < $max; $i++) {
    $tmpJ = array();
    for ($j = 0; $j < $max; $j++) {
        $tmpK = array();
        for ($k = 0; $k < $max; $k++) {
            $tmpK[] = 1;
        }
        $tmpJ[] = $tmpK;
    }
    $list[] = $tmpJ;
}

↑こっちのほうが速い!

スカラー vs 配列 どっちが速い?

function tmp($a, $b, $c, $d, $e, $f, $g, $h, $i, $j) {
    $ret = $a + $b + $c + $d + $e + $f + $g + $h + $i + $j;
}

for ($i = 0; $i < $max; $i++) {
    tmp(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
}
function tmp($data) {
    $ret = $data['a'] + $data['b']
         + $data['c'] + $data['d']
         + $data['e'] + $data['f']
         + $data['g'] + $data['h']
         + $data['i'] + $data['j'];
}

$data = array('a' => 0, 'b' => 1, 
              'c' => 2, 'd' => 3, 
              'e' => 4, 'f' => 5, 
              'g' => 6, 'h' => 7, 
              'i' => 8, 'j' => 9);
              
for ($i = 0; $i < $max; $i++) {
    tmp($data);
}

↑こっちの方が速い! 引数が多くするよりも、引数を配列にして1つにしてしまったほうが速い。

※コードレビューをしていると、引数が多くなっていることに遭遇することが多い。 互換性を保つために引数が多くなっていることが要因。

所感

  • Webアプリケーションの開発コミュニティの活発さで言えばRailsであるが、やはりPHPのシェア(WordPressがあるから)というのはまだまだ圧倒的に高く、PHPカンファレンスの盛況っぷりには勢いを感じた。
  • 現在開発中のアプリではPHP5.5を利用しているが、PHP7はかなりの高速化が実現できるということで、将来的にはバージョンアップを前向きに検討したい。
  • Web上のPHPアプリケーションの80%ほどはセキュリティサポート切れの5.4以下ということで、将来的には脆弱性による脅威にさらされる危険性を感じた。
  • メルカリのサービス環境がすごい。やはり勢いのあるスタートアップの話は刺激的で参考になる。
  • 最近の勉強会では、今どきの開発環境というのがよく紹介されるが、ソースコードGithubにあって、本番環境がAWSで自動デプロイという前提が多く、セキュリティポリシーの厳しい環境でどのように自動化していくかというのかという問題にいつもぶつかる…
  • 徳丸先生のセッションには出られなかったので、後で読んでおこう。