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.6k
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.7k
Other Decks in Technology
See All in Technology
AIの最新技術&テーマをつまんで紹介&フリートークするシリーズ #1 量子機械学習の入門
tkhresk
0
130
標準技術と独自システムで作る「つらくない」SaaS アカウント管理 / Effortless SaaS Account Management with Standard Technologies & Custom Systems
yuyatakeyama
3
1.2k
Oracle Audit Vault and Database Firewall 20 概要
oracle4engineer
PRO
3
1.7k
ひとり情シスなCTOがLLMと始めるオペレーション最適化 / CTO's LLM-Powered Ops
yamitzky
0
420
実践! AIエージェント導入記
1mono2prod
0
160
Amazon Bedrockで実現する 新たな学習体験
kzkmaeda
1
530
mrubyと micro-ROSが繋ぐロボットの世界
kishima
2
210
Snowflake Summit 2025 データエンジニアリング関連新機能紹介 / Snowflake Summit 2025 What's New about Data Engineering
tiltmax3
0
310
TechLION vol.41~MySQLユーザ会のほうから来ました / techlion41_mysql
sakaik
0
180
Understanding_Thread_Tuning_for_Inference_Servers_of_Deep_Models.pdf
lycorptech_jp
PRO
0
110
Claude Code Actionを使ったコード品質改善の取り組み
potix2
PRO
6
2.2k
Fabric + Databricks 2025.6 の最新情報ピックアップ
ryomaru0825
1
130
Featured
See All Featured
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
138
34k
Optimizing for Happiness
mojombo
379
70k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
17
940
For a Future-Friendly Web
brad_frost
179
9.8k
[RailsConf 2023] Rails as a piece of cake
palkan
55
5.6k
Stop Working from a Prison Cell
hatefulcrawdad
270
20k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
Measuring & Analyzing Core Web Vitals
bluesmoon
7
490
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
670
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.5k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
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への評価が向上 ・エンジニアのモチベーションアップ まとめ
最後に
バージョンアップをする際には いつまでに何をどこまでするかを事前に目標立てることで バージョンアップ以上の成果を出すことができる!
よきバージョンアップライフを!
ご静聴ありがとうございました