Slide 1

Slide 1 text

3ヶ月でphp5.5から7.2に バージョンアップした現在と 今後の向き合い方 菅原 佑太 / kosa3 株式会社ウエディングパーク

Slide 2

Slide 2 text

PHPバージョンアップしてますか?

Slide 3

Slide 3 text

Web業界のPHPバージョンアップの実態 その他 21.1% PHP 78.9% WebサイトにPHPを採用している企業 (2018/11/21) ・中でもPHP5系のWebサイトは61.6%! ・PHP5系 2018年内でのサポート終了 =>多くの企業でPHPのセキュリティ サポートがきれてしまう… 参照:https://techtarget.itmedia.co.jp/tt/news/1811/21/news07.html

Slide 4

Slide 4 text

・自己紹介 & 会社紹介 ・PHPバージョンアップの過程とハマりポイントの共有 ・PHPバージョンアップ後のサイトの変化 ・今後のPHPバージョンアップを見据えてやりたかったこと アジェンダ

Slide 5

Slide 5 text

・結婚・婚約指輪の口コミサイト  「Ringraph(リングラフ)」の   運用・開発責任者 ・サーバーサイドエンジニア ・PHPer歴 3年 ・Goやjs界隈も好きです 菅原 佑太 株式会社ウエディングパーク 新卒3年目/チーフエンジニア kosa3

Slide 6

Slide 6 text

公式キャラクター「ウエパ」 


Slide 7

Slide 7 text

PHILOSOPHY

Slide 8

Slide 8 text

運営サービス

Slide 9

Slide 9 text

・ウエディングパークの姉妹サイト ・指輪選びの決め手が見つかるクチコミ   サイト ・2015年 9月からサービススタート(3歳) ・クチコミ数2万件以上 Ringraph

Slide 10

Slide 10 text

・PHP5.5 ・Codeigniter 3.0 ・インフラはAWSで構成 当時のシステム

Slide 11

Slide 11 text

? 内部セキュリティチェッ ク実施 リリース 2018/8 2018/9 2018/10 2018/11 2018/12 ? ?

Slide 12

Slide 12 text

・社内でセキュリティチェック実施での指摘 ・RingraphとPhotoraitがバージョンアップ対象 ・2018年内にリリースMust リリースまで約3ヶ月、、、。 PHPバージョンアップのきっかけ

Slide 13

Slide 13 text

・3ヶ月のタイトなスケジュール ・PHPのバージョンアップのノウハウ不足 ・人員リソース不足 当時の運用体制(エンジニア・デザイナー・ディレクタ1名ずつ) PHPバージョンアップの不安点

Slide 14

Slide 14 text

まずは調査開始

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

phpの公式ドキュメントから 移行について洗い出し、 該当するか調べる 調査 その1

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

大体つまずきそうなところは分かった!

Slide 21

Slide 21 text

Docker環境を作り PHPのバージョンをあげて検証してみる 調査 その2

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

$ docker-compose up

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

まぁまぁここまでは想定内… きっと他のミドルやモジュールの 関係だろう

Slide 26

Slide 26 text

調査結果

Slide 27

Slide 27 text

・Codeigniter Framework ・CentOS ・Apache ・node.js ・ruby ・composer ・mod_small_light module ・mcrypt module ・その他モジュールやクライアントライブラリなど PHP以外に必要なバージョンアップ

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

・1人での開発リソースは半年程の見積もり ・運用案件の並行開発 ・2018年内リリース[Must] 10月からエンジニアを2名増員! 急遽エンジニア2名増員

Slide 30

Slide 30 text

スケジュール調整 基盤環境構築・開発 ? 内部セキュリティチェッ ク実施 リリース 2018/8 2018/9 2018/10 2018/11 2018/12 ?

Slide 31

Slide 31 text

・管理画面と公開画面の基盤作成 ・10月エンジニア2名のスムーズな参画の準備 9月 PJキックオフ

Slide 32

Slide 32 text

・Memcachedモジュール問題 ・mcryptモジュールの非推奨に伴うリプレイス ・画像リサイズmod_small_lightモジュールリプレイス 9月 初期画面表示までにハマったこと

Slide 33

Slide 33 text

・Memcachedモジュール問題 ・mcryptモジュールの非推奨に伴うリプレイス ・画像リサイズmod_small_lightモジュールリプレイス 9月 初期画面表示までにハマったこと

Slide 34

Slide 34 text

memcached libMemcachedのバージョン依存問題 /usr/local/src/php-memcached/php_libmemcached_compat.h:56: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'php_memcached_instance_st' *wgetで最新のソースからインストールする必要がある。 memcache 現在開発が止まっていてphp7に対応していない。 歴史のあるサイトだとmemcachedあるいは別サービスを利用 するなどの検討も。 Memcachedモジュール問題

Slide 35

Slide 35 text

・Memcachedモジュール ・mcryptモジュールの非推奨に伴うリプレイス ・画像リサイズmod_small_lightモジュールリプレイス 9月 初期画面表示までにハマったこと

Slide 36

Slide 36 text

・PHP7.2からmcrypt暗号化モジュールが完全非推奨  => 全てOpenSSLに変更 mcryptの完全非推奨

Slide 37

Slide 37 text

mcryptよりOpenSSLの方が処理速度も良い mcryptの完全非推奨

Slide 38

Slide 38 text

openssl vs mcrypt 環境:MacOS, PHP7.0(mcrypt), PHP7.2(openssl) 暗号化、復号化回数: 1000回 key: Seattle Mariners value: イチロー引退 method: AES-128-ECB 暗号化、復号化の速度検証。。!

Slide 39

Slide 39 text

openssl vs mcrypt 環境:MacOS, php7.0(mcrypt), php7.2(openssl) 暗号化、復号化回数: 1000回 key: Seattle Mariners value: イチロー引退 method: AES-128-ECB mcrypt encrypt time: 0.078732013702393 decrypt time: 0.068650007247925

Slide 40

Slide 40 text

openssl vs mcrypt 環境:MacOS, php7.0(mcrypt), php7.2(openssl) 暗号化、復号化回数: 1000回 key: Seattle Mariners value: イチロー引退 method: AES-128-ECB openssl encrypt time: 0.00084805488586426 decrypt time: 0.00096797943115234

Slide 41

Slide 41 text

mcryptで暗号化された値をOpenSSLで復号化 mcryptのpaddingの仕様で暗号化の差異が発生する => 無理に合わせる関数を作るか、OpenSSLに移行する か。。 mcryptの完全非推奨

Slide 42

Slide 42 text

・Memcachedモジュール ・mcryptモジュールの非推奨に伴うリプレイス ・画像リサイズmod_small_lightモジュールリプレイス 9月 初期画面表示までにハマったこと

Slide 43

Slide 43 text

・memcachedモジュール ・mcryptモジュールの非推奨に伴うリプレイス ・画像リサイズmod_small_lightモジュールリプレイス 9月 初期画面表示までにハマったこと =>姉妹サイトの「Weddingpark DRESS」がlambdaでの   画像リサイズを導入していたので横展させてもらう

Slide 44

Slide 44 text

・mod_dimsなど他モジュールで代用 ・コンテンツサーバーを用意 ・有償CDN (imgix, Fastly Image Optimizer...) ・lambda でリサイズ関数を作成 画像リサイズmod_small_lightのアーキテクチャ変更 要件) 画像のリサイズ、 短い工数で、 サーバー負荷抑えたい

Slide 45

Slide 45 text

・mod_dimsなど他モジュールで代用 ・コンテンツサーバーを用意 ・有償CDN (imgix, Fastly Image Optimizer...) ・lambda でリサイズ関数を作成 画像リサイズmod_small_lightのアーキテクチャ変更 要件) 画像のリサイズ、 短い工数で、 サーバー負荷抑えたい

Slide 46

Slide 46 text

アーキテクチャ

Slide 47

Slide 47 text

スケジュール調整 基盤環境構築・開発 ? 内部セキュリティチェッ ク実施 新エンジニア2人参画 PHPバージョンアップ開 発 リリース 2018/8 2018/9 2018/10 2018/11 2018/12

Slide 48

Slide 48 text

開発体制 10月 新エンジニア参画・開発 タスク管理 エラー検知

Slide 49

Slide 49 text

・動くようにする ・ログなどのエラーが出ないようにする ・リファクタリング(コードレビュー負荷軽減、  余計なロジック周りのテストの影響範囲を抑える) やるべきこと やらないこと プロジェクトルール

Slide 50

Slide 50 text

・PHP7.2からのcountの仕様変更 ・Cloudfrontの導入によるIP問題 ・php7系のエラーハンドリングの仕様変更 ・既存システムの不具合 10月 開発時にハマったこと

Slide 51

Slide 51 text

・PHP7.2からのcountの仕様変更 ・Cloudfrontの導入によるIP問題 ・php7系のエラーハンドリングの仕様変更 ・既存システムの不具合 10月 開発時にハマったこと

Slide 52

Slide 52 text

・PHP7.2から配列またはcontableインタフェースで 実装されたObject以外だとWarningエラーを出力 Warning: count(): Parameter must be an array or an object that implements Countable サイト全体的に影響が大きい仕様変更 PHP7.2からのcountの仕様変更

Slide 53

Slide 53 text

・PHP7.3からcountの判定をするメソッドが実装された PHP7.2からのcountの仕様変更

Slide 54

Slide 54 text

・php7.2からのcountの仕様変更 ・Cloudfrontの導入によるIP問題 ・php7系のエラーハンドリングの仕様変更 ・既存システムの不具合 10月 開発時にハマったこと

Slide 55

Slide 55 text

サイト全体にCDNを導入 クチコミ投稿時やログなどの記録で固定のipが入る $ip = $_SERVER['REMOTE_ADDR']; // CloudfrontのIPが入る $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; // アクセスIP元まで取得 *またCloudfrontのデフォルトオリジンレスポンスタイムアウトは30秒 レポートなど処理の長い時間がかかる場合は注意 Cloudfront導入によるIP問題

Slide 56

Slide 56 text

・PHP7.2からのcountの仕様変更 ・Cloudfrontの導入によるIP問題 ・PHP7系のエラーハンドリングの仕様変更 ・既存システムの不具合 10月 開発時にハマったこと

Slide 57

Slide 57 text

PHP7系から大半のエラーがErrorクラスとして例外を 報告するようになり、php5系でのcatchして Exceptionを検知するだけでは十分ではなくなった。 ThrowableはErrorとExceptionで実装されている *Errorクラスのduplicateに注意 php7系のエラーハンドリングの仕様変更

Slide 58

Slide 58 text

・php7.2からのcountの仕様変更 ・Cloudfrontの導入によるIP問題 ・PHP7系のエラーハンドリングの仕様変更 ・既存システムの不具合 10月 開発時にハマったこと

Slide 59

Slide 59 text

・全体に及ぶ影響から全範囲を開発・テスト ・意図せぬ不具合を発覚(Sentry, 監査) ・修正 & 報告書 => 工数に入れていない&対応に時間がかかる 既存システムの不具合

Slide 60

Slide 60 text

スケジュール調整 基盤環境構築・開発 外部セキュリティチェッ ク実施 内部セキュリティチェッ ク実施 新エンジニア2人参画 PHPバージョンアップ開 発 リリース 2018/8 2018/9 2018/10 2018/11 2018/12

Slide 61

Slide 61 text

・2~3週間でセキュリティチェック実施 ・大きな問題なしでリソースに余裕が発生 リソースに余裕が出たので11月はテストコードを導入 社外セキュリティチェック

Slide 62

Slide 62 text

・Controller、Model中心に導入 カバレッジ (70~80%) ・CircleCIで自動テスト実施 unitテスト導入

Slide 63

Slide 63 text

スケジュール調整 基盤環境構築・開発 外部セキュリティチェッ ク実施 内部セキュリティチェッ ク実施 新エンジニア2人参画 PHPバージョンアップ開 発 リリース 2018/8 2018/9 2018/10 2018/11 2018/12

Slide 64

Slide 64 text

・早朝のアクセスが少ない時間にメンテナンス画面 ・新サーバーへのDNS切り替え ・リリース完了! リリース方法

Slide 65

Slide 65 text

リリース後のサイト

Slide 66

Slide 66 text

画面平均1.2秒の改善へ!姉妹サイトも同様に改善 サイトパフォーマンス

Slide 67

Slide 67 text

よかったこと ・PJ開発ルールの統一 ・ミドルのバージョンをモダンにできた ・WAF、CloudFrontなどアーキテクチャを追加 ・SEO対策、パフォーマンス施策など打てた ・php-cs-fixerを導入し、コードの統一した ・テストコードを導入し、CircleCIで自動テストを運用できた ・姉妹サイトと連携を取りながら進めることができた

Slide 68

Slide 68 text

課題だったこと ・全体工数見積もりの算出 ・既存システムの不具合にかかるリソースコスト ・現行システムの運用案件の並行開発

Slide 69

Slide 69 text

次回やってみたいこと

Slide 70

Slide 70 text

・CIでPHP最新バージョンのテスト実行環境準備 ・ALBのコンテントベースルーティングでの開発 ・本番環境のコンテナ化 ・E2Eテスト ・カナリアデプロイ ・PHP7を活かしたコードへのリファクタリング 次回やってみたいこと

Slide 71

Slide 71 text

まとめ

Slide 72

Slide 72 text

・PHPの下位互換性が大きい ・サイト構成の見直しのきっかけができた ・廃止された関数やモジュールは事前にチェック ・実施後はサイトパフォーマンスやSEOへの評価が向上 ・エンジニアのモチベーションアップ まとめ

Slide 73

Slide 73 text

最後に

Slide 74

Slide 74 text

バージョンアップをする際には いつまでに何をどこまでするかを事前に目標立てることで バージョンアップ以上の成果を出すことができる!

Slide 75

Slide 75 text

よきバージョンアップライフを!

Slide 76

Slide 76 text

ご静聴ありがとうございました