Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
3ヶ月でphp5.5から7.2にバージョンアップした現在と今後の向き合い方 #PHPerKai...
Search
kosa3
March 30, 2019
Technology
1
3.4k
3ヶ月でphp5.5から7.2にバージョンアップした現在と今後の向き合い方 #PHPerKaigi 2019
PHPerKaigi 2019での発表資料です。
kosa3
March 30, 2019
Tweet
Share
More Decks by kosa3
See All by kosa3
今からでも間に合うphp5.5からphp7.2にバージョンアップした話 #phpcon
kosa3
5
1.6k
Other Decks in Technology
See All in Technology
Amazon VPC Lattice 最新アップデート紹介 - PrivateLink も似たようなアップデートあったけど違いとは
bigmuramura
0
190
AWS re:Invent 2024で発表された コードを書く開発者向け機能について
maruto
0
180
ブラックフライデーで購入したPixel9で、Gemini Nanoを動かしてみた
marchin1989
1
520
Oracle Cloudの生成AIサービスって実際どこまで使えるの? エンジニア目線で試してみた
minorun365
PRO
4
270
非機能品質を作り込むための実践アーキテクチャ
knih
3
700
ガバメントクラウドのセキュリティ対策事例について
fujisawaryohei
0
530
サイボウズフロントエンドエキスパートチームについて / FrontendExpert Team
cybozuinsideout
PRO
5
38k
AWS re:Invent 2024 ふりかえり
kongmingstrap
0
130
Snykで始めるセキュリティ担当者とSREと開発者が楽になる脆弱性対応 / Getting started with Snyk Vulnerability Response
yamaguchitk333
2
180
【re:Invent 2024 アプデ】 Prompt Routing の紹介
champ
0
140
1等無人航空機操縦士一発試験 合格までの道のり ドローンミートアップ@大阪 2024/12/18
excdinc
0
150
新機能VPCリソースエンドポイント機能検証から得られた考察
duelist2020jp
0
210
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
The Pragmatic Product Professional
lauravandoore
32
6.3k
Visualization
eitanlees
146
15k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.4k
A Tale of Four Properties
chriscoyier
157
23k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
17
2.2k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
Done Done
chrislema
181
16k
Gamification - CAS2011
davidbonilla
80
5.1k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Transcript
3ヶ月でphp5.5から7.2に バージョンアップした現在と 今後の向き合い方 菅原 佑太 / kosa3 株式会社ウエディングパーク
PHPバージョンアップしてますか?
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
・自己紹介 & 会社紹介 ・PHPバージョンアップの過程とハマりポイントの共有 ・PHPバージョンアップ後のサイトの変化 ・今後のPHPバージョンアップを見据えてやりたかったこと アジェンダ
・結婚・婚約指輪の口コミサイト 「Ringraph(リングラフ)」の 運用・開発責任者 ・サーバーサイドエンジニア ・PHPer歴 3年 ・Goやjs界隈も好きです 菅原 佑太 株式会社ウエディングパーク
新卒3年目/チーフエンジニア kosa3
公式キャラクター「ウエパ」
PHILOSOPHY
運営サービス
・ウエディングパークの姉妹サイト ・指輪選びの決め手が見つかるクチコミ サイト ・2015年 9月からサービススタート(3歳) ・クチコミ数2万件以上 Ringraph
・PHP5.5 ・Codeigniter 3.0 ・インフラはAWSで構成 当時のシステム
? 内部セキュリティチェッ ク実施 リリース 2018/8 2018/9 2018/10 2018/11 2018/12 ?
?
・社内でセキュリティチェック実施での指摘 ・RingraphとPhotoraitがバージョンアップ対象 ・2018年内にリリースMust リリースまで約3ヶ月、、、。 PHPバージョンアップのきっかけ
・3ヶ月のタイトなスケジュール ・PHPのバージョンアップのノウハウ不足 ・人員リソース不足 当時の運用体制(エンジニア・デザイナー・ディレクタ1名ずつ) PHPバージョンアップの不安点
まずは調査開始
None
None
phpの公式ドキュメントから 移行について洗い出し、 該当するか調べる 調査 その1
None
None
大体つまずきそうなところは分かった!
Docker環境を作り PHPのバージョンをあげて検証してみる 調査 その2
None
$ docker-compose up
None
まぁまぁここまでは想定内… きっと他のミドルやモジュールの 関係だろう
調査結果
・Codeigniter Framework ・CentOS ・Apache ・node.js ・ruby ・composer ・mod_small_light module ・mcrypt
module ・その他モジュールやクライアントライブラリなど PHP以外に必要なバージョンアップ
None
・1人での開発リソースは半年程の見積もり ・運用案件の並行開発 ・2018年内リリース[Must] 10月からエンジニアを2名増員! 急遽エンジニア2名増員
スケジュール調整 基盤環境構築・開発 ? 内部セキュリティチェッ ク実施 リリース 2018/8 2018/9 2018/10 2018/11
2018/12 ?
・管理画面と公開画面の基盤作成 ・10月エンジニア2名のスムーズな参画の準備 9月 PJキックオフ
・Memcachedモジュール問題 ・mcryptモジュールの非推奨に伴うリプレイス ・画像リサイズmod_small_lightモジュールリプレイス 9月 初期画面表示までにハマったこと
・Memcachedモジュール問題 ・mcryptモジュールの非推奨に伴うリプレイス ・画像リサイズmod_small_lightモジュールリプレイス 9月 初期画面表示までにハマったこと
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モジュール問題
・Memcachedモジュール ・mcryptモジュールの非推奨に伴うリプレイス ・画像リサイズmod_small_lightモジュールリプレイス 9月 初期画面表示までにハマったこと
・PHP7.2からmcrypt暗号化モジュールが完全非推奨 => 全てOpenSSLに変更 mcryptの完全非推奨
mcryptよりOpenSSLの方が処理速度も良い mcryptの完全非推奨
openssl vs mcrypt 環境:MacOS, PHP7.0(mcrypt), PHP7.2(openssl) 暗号化、復号化回数: 1000回 key: Seattle
Mariners value: イチロー引退 method: AES-128-ECB 暗号化、復号化の速度検証。。!
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
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
mcryptで暗号化された値をOpenSSLで復号化 mcryptのpaddingの仕様で暗号化の差異が発生する => 無理に合わせる関数を作るか、OpenSSLに移行する か。。 mcryptの完全非推奨
・Memcachedモジュール ・mcryptモジュールの非推奨に伴うリプレイス ・画像リサイズmod_small_lightモジュールリプレイス 9月 初期画面表示までにハマったこと
・memcachedモジュール ・mcryptモジュールの非推奨に伴うリプレイス ・画像リサイズmod_small_lightモジュールリプレイス 9月 初期画面表示までにハマったこと =>姉妹サイトの「Weddingpark DRESS」がlambdaでの 画像リサイズを導入していたので横展させてもらう
・mod_dimsなど他モジュールで代用 ・コンテンツサーバーを用意 ・有償CDN (imgix, Fastly Image Optimizer...) ・lambda でリサイズ関数を作成 画像リサイズmod_small_lightのアーキテクチャ変更
要件) 画像のリサイズ、 短い工数で、 サーバー負荷抑えたい
・mod_dimsなど他モジュールで代用 ・コンテンツサーバーを用意 ・有償CDN (imgix, Fastly Image Optimizer...) ・lambda でリサイズ関数を作成 画像リサイズmod_small_lightのアーキテクチャ変更
要件) 画像のリサイズ、 短い工数で、 サーバー負荷抑えたい
アーキテクチャ
スケジュール調整 基盤環境構築・開発 ? 内部セキュリティチェッ ク実施 新エンジニア2人参画 PHPバージョンアップ開 発 リリース 2018/8
2018/9 2018/10 2018/11 2018/12
開発体制 10月 新エンジニア参画・開発 タスク管理 エラー検知
・動くようにする ・ログなどのエラーが出ないようにする ・リファクタリング(コードレビュー負荷軽減、 余計なロジック周りのテストの影響範囲を抑える) やるべきこと やらないこと プロジェクトルール
・PHP7.2からのcountの仕様変更 ・Cloudfrontの導入によるIP問題 ・php7系のエラーハンドリングの仕様変更 ・既存システムの不具合 10月 開発時にハマったこと
・PHP7.2からのcountの仕様変更 ・Cloudfrontの導入によるIP問題 ・php7系のエラーハンドリングの仕様変更 ・既存システムの不具合 10月 開発時にハマったこと
・PHP7.2から配列またはcontableインタフェースで 実装されたObject以外だとWarningエラーを出力 Warning: count(): Parameter must be an array or
an object that implements Countable サイト全体的に影響が大きい仕様変更 PHP7.2からのcountの仕様変更
・PHP7.3からcountの判定をするメソッドが実装された PHP7.2からのcountの仕様変更
・php7.2からのcountの仕様変更 ・Cloudfrontの導入によるIP問題 ・php7系のエラーハンドリングの仕様変更 ・既存システムの不具合 10月 開発時にハマったこと
サイト全体にCDNを導入 クチコミ投稿時やログなどの記録で固定のipが入る $ip = $_SERVER['REMOTE_ADDR']; // CloudfrontのIPが入る $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
// アクセスIP元まで取得 *またCloudfrontのデフォルトオリジンレスポンスタイムアウトは30秒 レポートなど処理の長い時間がかかる場合は注意 Cloudfront導入によるIP問題
・PHP7.2からのcountの仕様変更 ・Cloudfrontの導入によるIP問題 ・PHP7系のエラーハンドリングの仕様変更 ・既存システムの不具合 10月 開発時にハマったこと
PHP7系から大半のエラーがErrorクラスとして例外を 報告するようになり、php5系でのcatchして Exceptionを検知するだけでは十分ではなくなった。 ThrowableはErrorとExceptionで実装されている *Errorクラスのduplicateに注意 php7系のエラーハンドリングの仕様変更
・php7.2からのcountの仕様変更 ・Cloudfrontの導入によるIP問題 ・PHP7系のエラーハンドリングの仕様変更 ・既存システムの不具合 10月 開発時にハマったこと
・全体に及ぶ影響から全範囲を開発・テスト ・意図せぬ不具合を発覚(Sentry, 監査) ・修正 & 報告書 => 工数に入れていない&対応に時間がかかる 既存システムの不具合
スケジュール調整 基盤環境構築・開発 外部セキュリティチェッ ク実施 内部セキュリティチェッ ク実施 新エンジニア2人参画 PHPバージョンアップ開 発 リリース
2018/8 2018/9 2018/10 2018/11 2018/12
・2~3週間でセキュリティチェック実施 ・大きな問題なしでリソースに余裕が発生 リソースに余裕が出たので11月はテストコードを導入 社外セキュリティチェック
・Controller、Model中心に導入 カバレッジ (70~80%) ・CircleCIで自動テスト実施 unitテスト導入
スケジュール調整 基盤環境構築・開発 外部セキュリティチェッ ク実施 内部セキュリティチェッ ク実施 新エンジニア2人参画 PHPバージョンアップ開 発 リリース
2018/8 2018/9 2018/10 2018/11 2018/12
・早朝のアクセスが少ない時間にメンテナンス画面 ・新サーバーへのDNS切り替え ・リリース完了! リリース方法
リリース後のサイト
画面平均1.2秒の改善へ!姉妹サイトも同様に改善 サイトパフォーマンス
よかったこと ・PJ開発ルールの統一 ・ミドルのバージョンをモダンにできた ・WAF、CloudFrontなどアーキテクチャを追加 ・SEO対策、パフォーマンス施策など打てた ・php-cs-fixerを導入し、コードの統一した ・テストコードを導入し、CircleCIで自動テストを運用できた ・姉妹サイトと連携を取りながら進めることができた
課題だったこと ・全体工数見積もりの算出 ・既存システムの不具合にかかるリソースコスト ・現行システムの運用案件の並行開発
次回やってみたいこと
・CIでPHP最新バージョンのテスト実行環境準備 ・ALBのコンテントベースルーティングでの開発 ・本番環境のコンテナ化 ・E2Eテスト ・カナリアデプロイ ・PHP7を活かしたコードへのリファクタリング 次回やってみたいこと
まとめ
・PHPの下位互換性が大きい ・サイト構成の見直しのきっかけができた ・廃止された関数やモジュールは事前にチェック ・実施後はサイトパフォーマンスやSEOへの評価が向上 ・エンジニアのモチベーションアップ まとめ
最後に
バージョンアップをする際には いつまでに何をどこまでするかを事前に目標立てることで バージョンアップ以上の成果を出すことができる!
よきバージョンアップライフを!
ご静聴ありがとうございました