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%高速
- WordPress4.4のベンチマークでは、PHP7はPHP5.6よりも2倍高速
- スカラー型宣言と戻り型宣言のサポート
- デフォルト動作は従来と同じ
- Strictモードにすると厳密な型チェックが有効になる
- 整数型と文字列型を厳密に区別してエラーを出すようにするなど
- 致命的エラーを例外補足可能に
- エラーをtry / catchで取得可能
- <=>演算子
- パーサとコンパイラを分離
- コード管理が容易になり、最適化・メモリ削減
- エクステンション削除:ereg, mysql, mssql
- SAPI削除:22種類 → 7種類
- newオブジェクトの参照代入廃止
- PHP4形式のコンストラクタは警告が出る
- 将来的には廃止予定
- エクステンションは要変更
PHPのこれから
PHPの未来
- Hack/HHVMリリースの持つ意味
- PHP7は劇的に進化した、そしてこれからも…
- 高性能かつ現実的な解を継続的に提供する
フリマアプリ「メルカリ」の急成長を支えるエンジニアリング 久保達彦
メルカリの提供環境について
- インフラチーム:4人
総エンジニア数:30人弱
イントラはさくらの専用サーバ
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開発現場 -2015年秋- 新原雅司
PhpStorm
Vagrant
- プロジェクト毎に独立した環境
- 自動構築
- チームで同じ環境を利用
- 運用環境と同じ環境
Vagrant導入ポイント
フレームワーク
- コンポーネント指向が主流
- Symfony / Zend Framework / Aura / CakePHP3 / Laravel / BEAR.Sunday
- コンポーネントを分離して利用できる
- 他のフレームワークのコンポーネントを利用
Laravel
フレームワークの付き合い方
CI
- git push / PRを検知してタスクを自動実行
- テスト実行、フォーマットチェック、静的解析
- 自前ならJenkins
- SaaSならTravis CI / Circle 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で自動デプロイという前提が多く、セキュリティポリシーの厳しい環境でどのように自動化していくかというのかという問題にいつもぶつかる…
- 徳丸先生のセッションには出られなかったので、後で読んでおこう。