phpcon2017に参加したのでざっくりメモ。
※参加しながらのメモなので随時更新します。
「OPcacheの最適化器の今」
スライド:
www.slideshare.net
PHPを実行時はバイトコード命令にコンパイルして逐次実行している。
OPchaceの役割
キャッシュ済みならキャッシュからバイトコード命令を実行する
キャッシュ済みでないならコンパイルしてキャッシュする
コンパイル時に最適化しておけばはやくなるんじゃね?これだ!!
PHP5.5の最適化
- 定数式の置き換え
- 条件分岐の置き換え
- 連続ジャンプの短絡
- 制御フローグラフ
- グラフ構造を表現しておき、必要な命令だけを残す
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 が全てをやってはくれない
- 実はバージョン同居できる
質問
- どれくらいの以降期間を想定しているか?
- エンジニアではない関係者にどのように説得したか?
- 開発速度を早めることができますよ、今の施策やりながら裏でアップデートしますよ。というような伝え方。
- 3系にあげる際の戦略はありますか?
- 基本的には2系にあげる時と同じやり方を考えています。
Serverless FrameworkでAWSフルマネージドなツールをいくつか作って得たアーキテクチャ設計の知見
スライドは後日公開されるらしい
※諸説ある
- イベントドリブン
- サーバ単位ではなくイベント単位
- ステートレス
- 実行後のコンテナは破棄されるのでステートレスなアーキテクトが求められる
いわゆるLAMPアーキテクチャでは開発者がOSから環境まで、管理する必要がある。
それに対してサーバレスアーキテクチャではイベントを管理、実行を管理する必要がある。
開発者は動くための関数だけを管理すれば良い。
Serverless Frameworkとは何か
インフラもアプリも一括管理できるデプロイツール
サーバレスアーキテクチャで開発する際に気をつける事
- LAMPアーキテクチャではない事を知る。
- ステートをモテない
- 安易にRDMSを使用するとアンチパターン
- 画像などのバイナリの取り扱いは難しい(リクエスト・レスポンス制限)
- 認証・認可の仕組み
- マネージドサービスを知る
tipsみたいなもの
- POST with config
- 設定値もステートなので、POSTに含めてしまう
- Reserved Timestamp ID
- 実は一覧を作るのは難しい
- S3を使っている
- Instant Job Queue
- S3 Object Tagging
- Env Sync
- デプロイ時の環境変数とfunctionが実行されるコンテナの環境変数に設定する
まとめ
サーバレスアーキテクトが得意なものとLAMPアーキテクトが得意なものは違う。サーバレスアーキテクトがハマると強力。
Serverless Frameworkを使うとインフラもコードで管理できる。
広告配信管理システムを支えるPHP ~ レガシーシステムからの段階的移行戦略
speakerdeck.com
価値あるコードをよりよくしたい
下準備
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してやるとよい