phpcon2017に参加したのでざっくりメモ。
※参加しながらのメモなので随時更新します。
「OPcacheの最適化器の今」
スライド:
PHPを実行時はバイトコード命令にコンパイルして逐次実行している。
OPchaceの役割
キャッシュ済みならキャッシュからバイトコード命令を実行する
キャッシュ済みでないならコンパイルしてキャッシュする
コンパイル時に最適化しておけばはやくなるんじゃね?これだ!!
PHP5.5の最適化
- 定数式の置き換え
- 計算が必要な定数をあらかじめ計算しておくなど
- 条件分岐の置き換え
- 実行時には条件分岐が決まってるので計算しておく
- 連続ジャンプの短絡
- 省略できるif文などは省略
- 制御フローグラフ
- グラフ構造を表現しておき、必要な命令だけを残す
PHP5.6の最適化
- 関数呼び出しの効率化
- 未使用リテラルの削除
PHP7.0の最適化
- 関数スタックフレームの最適化 そんなに大きく変わってない
PHP7.1の最適化
- コールグラフの構築
- 関数間の呼び出し関係をグラフ構造に表現し、最適化する
- データフロー解析に基づく最適化
- プログラムの各点でデータが取り得る値を解析する
PHP7.2の最適化
PHP7.2にしよう!!
Lancersのバージョンアップ施策について
過去にもリプレースしようとしたが、2年かかる見積もりだったので、ペンドになった。 要因としてソースコードが肥大化していた。ソースコード全体で約60万行くらいあった。
目的
- 開発リソースの最大化
- サポートが終了している
- Cake1.3もサポートが、、
バージョンアップの前準備として
今あるユニットテストを動くようにする。Nginx + php-fpmで動くようにする。
段階的にあげるように戦略を立てた。 推進者一人、インフラ担当一人、アプリエンジニア一人。
Cake1.3から2.8で詰まったところ
アップグレードシェルの実行だけでは動かなかった。変更点のドキュメントを読み修正していく必要があった。 ヘルパーの仕様が変わってた部分については、ラッパークラスを作成する事で対応していった。
進め方
アップデートしたブランチを作成し、そこで動作確認しつつ修正を加えていく。 毎週masterから差分を取り込むのが大変、、同じような修正が必要になる。 →オレオレUpgradeShellを作った。
事前にCakePHP1.3でできることは先にやっていく。
まとめて切り替えるのではなく、1コントローラーずつ以降していく事で安全に切り替える。 →1.3と2.8の同居をさせるためにindex.phpに細工を入れる。
今後の進め方
PHPのバージョンアップはカナリアテスト。CakePHPのバージョンアップは2バージョンを用意しながら少しずつ進めていく。Codeceptionを利用していく。ユニットテストも2バージョンを用意していく。
まとめ
- 事前にできることはやっておく
- Upgrade Shell が全てをやってはくれない
- 実はバージョン同居できる
質問
- どれくらいの以降期間を想定しているか?
- 1年から1年半程度
- エンジニアではない関係者にどのように説得したか?
- 開発速度を早めることができますよ、今の施策やりながら裏でアップデートしますよ。というような伝え方。
- 3系にあげる際の戦略はありますか?
- 基本的には2系にあげる時と同じやり方を考えています。
Serverless FrameworkでAWSフルマネージドなツールをいくつか作って得たアーキテクチャ設計の知見
スライドは後日公開されるらしい
サーバーレスアーキテクチャ
※諸説ある - イベントドリブン - サーバ単位ではなくイベント単位 - ステートレス - 実行後のコンテナは破棄されるのでステートレスなアーキテクトが求められる
いわゆるLAMPアーキテクチャでは開発者がOSから環境まで、管理する必要がある。 それに対してサーバレスアーキテクチャではイベントを管理、実行を管理する必要がある。 開発者は動くための関数だけを管理すれば良い。
Serverless Frameworkとは何か
インフラもアプリも一括管理できるデプロイツール
サーバレスアーキテクチャで開発する際に気をつける事
サーバレスアーキテクチャでの設計やアイデア
tipsみたいなもの - POST with config - 設定値もステートなので、POSTに含めてしまう - Reserved Timestamp ID - 実は一覧を作るのは難しい - S3を使っている - Instant Job Queue - S3 Object Tagging - Env Sync - デプロイ時の環境変数とfunctionが実行されるコンテナの環境変数に設定する
まとめ
サーバレスアーキテクトが得意なものとLAMPアーキテクトが得意なものは違う。サーバレスアーキテクトがハマると強力。 Serverless Frameworkを使うとインフラもコードで管理できる。
広告配信管理システムを支えるPHP ~ レガシーシステムからの段階的移行戦略
価値あるコードをよりよくしたい
下準備
phpmd, phpcpd, phpdcd, phpcs, phan などを使い複雑そうなところを見つける
例外とハンドリング
- アプリケーションベース例外を定義
- アプリケーショングローバルな例外ハンドラを実装
- ロギングとエラー表示
アプリケーションベース例外にユーザ向けのメッセージを表示するためのメンバ変数を定義している。 ロギングも例外の中でやってくれるようにしているので、例外を投げるだけでいい。
NewRelicを使ってモニタリング
パフォーマンスモニタリングもできる。 エラーがどこでどれだけ起きてたかなどを見れる。
コードを消す
PHPStormつかってます。
phpcs + php7ccで洗い出しつつ基本はマニュアル読みながら修正。
どんどん使用していないものは削除。テストも合わせて消す。
遅いテストは生産性を落とす。
Redashにたよる。「それRedashでよくない?このクエリでデータ出せますよ」
「最良のコードは、コードなし」いらないコードはどんどん消そう。コードなしで機能を提供できるならない方がいい。
外部ツールにうまく頼ろう!!
実装ガイドラインを作る
PSR-1,2準拠 + php-cs-fixerのci組み込み
@deprecatedをうまく使い、非推奨なコードを明示。消す前に@deprecated入れて本番で出てないかログを見ることで安心して消せる。
まとめ
まずは守りを固めて、より良いコードをかける体制を作っていく。
DockerでPHPアプリケーションを本番リリースするまで
必要な事 - ローカルでコンテナを作成 - レジストリにコンテナをPUSH - 本番にリリース
K8S, GKE
マネージドな環境をつかうことで簡単にできる
Laravelで作る分析環境 ブースを回った
ここで差がつくエラー処理
メモ: 複数のphpのバージョンで実行結果を見ることができるらしい。便利そう。 3v4l.org
エラー
php7ではパースした時点でエラーになりうるものをエラーとして扱ってくれる。php7は賢いので。 (絶対実行されないif文の中でも)
例外
php5ではExceptionまたはExceptionを継承したクラス
php7ではThrowableを継承したクラス
エラーと例外(エラー)が混在していて扱いが面倒なので、例外(エラー)に統一してやると楽。
開発時、ユニットテストのときはE_ALLで指定してやって、本番ではE_ALL & ~E_NOTICE & ~E_DEPRECATEDしてやるとよい