Slide 1

Slide 1 text

2021/10/03 #phpcon2021 @zosokh サービス運用エンジ ニアによるPHP8バー ジョンアップ奮闘記

Slide 2

Slide 2 text

ヒエイカザト 株式会社ウエディングパーク Photorait サーバーサイドエンジニア・チーフエンジニア 技術イベントも定期的に開催   @zosokh #野球観戦 #ちなヤク🐧 #娘は2歳 #イヤイヤ期 2 2021/10/28(木)19:00〜 at ZOOM

Slide 3

Slide 3 text

Photorait フォトレイト フォトウエディング、前撮りなど結婚写真 の撮影スタジオ・サロンを検索できる情報 サイト www.photorait.net 3

Slide 4

Slide 4 text

もくじ 4 ▪ バージョンアップの経緯 ▪ PHP8ローカル挙動確認 ▪ パフォーマンス検証とPHP8の選定 ▪ バグ解消・テスト・チーム連携 ▪ リリース ▪ リリース後のパフォーマンス計測 ▪ これからのバージョンアップ

Slide 5

Slide 5 text

PHP8への アップデート それは去年のPHPカンファレンスからはじまった。 5

Slide 6

Slide 6 text

2021年3月 PHP8アップデート 6 ▪ バージョン7.2 → 8系へアップデート ▪ フロント・API・管理画面の3プロジェクトを対応 ▪ フレームワークはCodeigniter3

Slide 7

Slide 7 text

一人! ▪ 私(主要開発)・上長(サポート)でバージョンアップを決行 開発アサイン編成 7 ※チームの開発エンジニアは複数人

Slide 8

Slide 8 text

少人数でも、チームとしては一体感。 ● 事業責任者・ディレクター・エンジニア・営業とコミュニケー ション多く仕事を行っており、職種違えど理解し合える環境があ る。 ● 互いに互いの成果を讃えあう文化 現場のチームワーク 8

Slide 9

Slide 9 text

7.4にあげましょう 9 上長から話があがる そうですね 8に上げれるか試して良いっすか 上長 私

Slide 10

Slide 10 text

● 去年のPHPカンファレンスのトークセッションを見てPHP8への興 味があった。 ● ダメだったら諦めようぐらいの気持ち ● フレームワークver upは諦める バージョンアップの 旅がはじまる 10

Slide 11

Slide 11 text

● 3ヶ月分の工数を事前に事業として確保。 ○ ロードマップ会議を定期的に行っていた ○ 工数3ヶ月が長いのか短いのかどうなのか 私は短いな・・と思いました。 対応工数 11 😂

Slide 12

Slide 12 text

● とりあえずPHP8環境で動かしてみない事には、具体的な問題点も 把握しづらい DockerでPHP8環境を作成。挙動確認を開始する 調査開始! 12

Slide 13

Slide 13 text

● 立ち上げたローカル環境(Docker)にプロジェクト配置   すでにPHP7.4へのアップデートの事は忘れている PHP8ローカル環境作成 13

Slide 14

Slide 14 text

14 試しにcomposer install 8環境に対応していないパッケージバージョンはエラー

Slide 15

Slide 15 text

15 composer.lockを削除 再度composer install composer.jsonのバージョンに則った最新パッケージがイ ンストール ● それでもエラーになるものも多い

Slide 16

Slide 16 text

16 パッケージを更新 ● composer removeでエラーになったパッケージ管理を 削除。 ● composer requireで最新パッケージをインストール

Slide 17

Slide 17 text

17 パッケージを更新 ● composer removeでエラーになったパッケージ管理を 削除。 ● composer requireで最新パッケージをインストール それでもエラーになるものは ● 依存パッケージがバージョン互換でない ● パッケージ自体が8を許容していない

Slide 18

Slide 18 text

18 セルフ管理 バージョンの依存関係でインストールできないものはgzip ダウンロードを試みる。 ● 動けばそのままgit管理 ● 差分が大量に出る。レビューが大変

Slide 19

Slide 19 text

19 セルフ管理

Slide 20

Slide 20 text

20 セルフ管理   後にパッケージ側がアップデートを行い、無事 composer管理出来る事に。 進行形で世間がPHP8対応している事を感じる

Slide 21

Slide 21 text

● implodeのパラメータ順序逆(7.4:非推奨、8非サポート) ● 数値と非数値文字列の比較if文修正 挙動確認とエラー対応 21 implode($array, ',') $condition = 0 // PHP7 $condition == '' // true // PHP8 $condition == '' // false

Slide 22

Slide 22 text

● implodeのパラメータ順序逆(7.4:非推奨、8非サポート) ● 数値と非数値文字列の比較if文修正 挙動確認とエラー対応 22 implode($array, ',') $condition = 0 // PHP7 $condition == '' // true // PHP8 $condition == '' // false grepだけでは発見できない不具合修正 テスト時に発見した既存バグの修正にも追われる

Slide 23

Slide 23 text

● New RelicのPHPエージェントが8に未対応であることが判明。イ ンストールできない。 New Relic 23

Slide 24

Slide 24 text

後にPHP8は対応された   しかしJITは対応されていなく、PHPエージェントをインストール するとJITが無効になるとのこと。 インストールを見送る New Relic 24 👍

Slide 25

Slide 25 text

パフォーマンス検証(ロー カル編) 25 PHP7.2(キャッシュ なし) PHP8.0.1(キャッ シュなし) PHP8.0.1(OPcache) PHP8.0.1(OPcache・ jit) Time taken for tests[sec] 3.556 4.779 1.193 1.146 Requests per second[#/sec] 14.06 10.46 41.92 43.63 Time per request[ms] 711.156 955.827 238.552 229.222 Time per request[ms] (across all concurrent requests) 71.116 95.583 23.855 22.922

Slide 26

Slide 26 text

パフォーマンス検証(ロー カル編) 26 PHP7.2(キャッシュ なし) PHP8.0.1(キャッ シュなし) PHP8.0.1(OPcache) PHP8.0.1(OPcache・ jit) Time taken for tests[sec] 3.556 4.779 1.193 1.146 Requests per second[#/sec] 14.06 10.46 41.92 43.63 Time per request[ms] 711.156 955.827 238.552 229.222 Time per request[ms] (across all concurrent requests) 71.116 95.583 23.855 22.922 ● OPcache・jitの効力を感じる。 ● PHP8だけのパフォーマンス効果は速度面はあまり見られなかっ た。

Slide 27

Slide 27 text

27 PHP8採用へ決定 ● このタイミングでPHP8導入を決める ● 事業責任者と上長に共有 ● 調査をしながらエラー修正していたので、残タスク等 の工数も精度高く共有できた。

Slide 28

Slide 28 text

● バージョンアップに関連しないが、このタイミングで技術負債を 解消。 ● sendgridをSMTPからAPIを利用したメール送信処理に修正した。 技術負債の解消 28

Slide 29

Slide 29 text

● バージョンアップに関連しないが、このタイミングで技術負債を 解消。 ● sendgridをSMTPからAPIを利用したメール送信処理に修正した。 結果、リリース後ここでバグを産む事に。やっぱり一緒にリリースし なければ良かったと後悔・・ 技術負債の解消 29

Slide 30

Slide 30 text

● エンジニア・ディレクター・デザイナー全員でPHP8検証環境で回 帰テストを行う ○ 元々、月一で回帰テストを実施している ● パフォーマンス、挙動、エラーなど、気づかなかったバグを発見。 ● リリース予定の成果物チェックという機会にもなる。 回帰テスト実施 30

Slide 31

Slide 31 text

● 事業に携わる全メンバーの集う週一定例(営業陣もいます) ● バージョンアップリリースに至るまで細かな進捗を発表 ○ 保守運用目的でのバージョンアップであるが、運用面・パ フォーマンス面で恩恵があることをチーム全員で認識   チーム全員で、バージョンアップを。自分ごと 事業定例での報告 31

Slide 32

Slide 32 text

● 細かなリリースフロー ● sentryのエラー監視 ● 深夜リリース リリース 32

Slide 33

Slide 33 text

● すべてまとめてリリースしてしまった。エラー対応に追われる。    ALBの加重ターゲットグループなどを利用して、トラフィッ クを少しづつ流してゆくリリースも検討するべきだった リリース(反省点) 33

Slide 34

Slide 34 text

リリース後の話 34

Slide 35

Slide 35 text

35 パフォーマンス計測 PHP7と8の差分(ms) 改善% トップページ -85 37.78% スタジオページ配下平均 -518 48.68% 検索ページ配下平均 -226 34.06% apacheアクセスログからサーバーレスポンス値を集計

Slide 36

Slide 36 text

36 パフォーマンス計測 PHP7と8の差分(ms) 改善% トップページ -85 37.78% スタジオページ配下平均 -518 48.68% 検索ページ配下平均 -226 34.06% apacheアクセスログからサーバーレスポンス値を集計 平均で30〜40%以上の速度改善

Slide 37

Slide 37 text

● バージョンアップを怠ると手間が増える ○ 今回、7.4から発生するエラーに出会う事が何個かあった ● チームとしてこまめなバージョンアップ体質を築くこと ● 事業のロードマップ化 今後のバージョンアップ について 37

Slide 38

Slide 38 text

● 保守運用・セキュリティ向上であることは間違いない ● 運用・開発効率化の一環 ● 運用者として、サイト全体の作りを見直せる機会 バージョンアップの意味 38

Slide 39

Slide 39 text

● サービス全体を作り替える楽しさ ● チームで担当を回す ● バージョンアップをカジュアルに モチベーション 39

Slide 40

Slide 40 text

● PHP8検討開始から対応・リリースまで2.5ヶ月 ● ローカル環境での検証作業。後に開発環境作成 ● OPcache・JIT効力を感じる ● Photoraitでは30%ぐらいの速度改善 ● バージョンアップは事業のロードマップ ● チーム全員で保守運用 まとめ 40

Slide 41

Slide 41 text

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