Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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.3k
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
検証と資産化を形にするプロダクト組織へ/tapple_pmconf2024
corin8823
1
4.8k
Will multimodal language processing change the world?
keio_smilab
PRO
2
270
Engineer Recruting Deck
siva_official
PRO
1
3.3k
実践/先取り「入門 Kubernetes Validating/Mutating Admission Policy」 / CloudNative Days Winter 2024
pfn
PRO
1
150
12/4(水)のBedrockアプデ速報(re:Invent 2024 Daily re:Cap #3 with AWS Heroes)
minorun365
PRO
2
330
マルチプロダクト、マルチデータ基盤での Looker活用事例 〜BQじゃなくてもLookerはいいぞ〜
gappy50
0
130
.NET のUnified AI Building Blocks 入門...!
okazuki
0
160
開志専門職大学特別講義 2024 オープニング
1ftseabass
PRO
0
220
開志専門職大学特別講義 2024 デモパート
1ftseabass
PRO
0
210
農業用ダム監視を目的とした衛星SAR 干渉解析の適用性について
osgeojp
0
130
LY Accessibility Guidelines @fukuoka_a11yconf_前夜祭
lycorptech_jp
PRO
1
140
データ基盤の負債解消のためのリプレイス
livesense
PRO
0
150
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Done Done
chrislema
181
16k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
0
70
Bash Introduction
62gerente
608
210k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
Ruby is Unlike a Banana
tanoku
97
11k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Into the Great Unknown - MozCon
thekraken
33
1.5k
Optimising Largest Contentful Paint
csswizardry
33
2.9k
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への評価が向上 ・エンジニアのモチベーションアップ まとめ
最後に
バージョンアップをする際には いつまでに何をどこまでするかを事前に目標立てることで バージョンアップ以上の成果を出すことができる!
よきバージョンアップライフを!
ご静聴ありがとうございました