Upgrade to Pro — share decks privately, control downloads, hide ads and more …

3ヶ月でphp5.5から7.2にバージョンアップした現在と今後の向き合い方 #PHPerKaigi 2019

kosa3
March 30, 2019

3ヶ月でphp5.5から7.2にバージョンアップした現在と今後の向き合い方 #PHPerKaigi 2019

PHPerKaigi 2019での発表資料です。

kosa3

March 30, 2019
Tweet

More Decks by kosa3

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

  3. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. PHILOSOPHY

    View Slide

  8. 運営サービス

    View Slide

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

    View Slide

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

    View Slide


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


    View Slide

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

    View Slide

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

    View Slide

  14. まずは調査開始

    View Slide

  15. View Slide

  16. View Slide

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

    View Slide

  18. View Slide

  19. View Slide

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

    View Slide

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

    View Slide

  22. View Slide

  23. $ docker-compose up

    View Slide

  24. View Slide

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

    View Slide

  26. 調査結果

    View Slide

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

    View Slide

  28. View Slide

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

    View Slide

  30. スケジュール調整
    基盤環境構築・開発

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  34. 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モジュール問題

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  39. 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

    View Slide

  40. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  46. アーキテクチャ

    View Slide

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

    リリース
    2018/8 2018/9 2018/10 2018/11 2018/12

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    リリース
    2018/8 2018/9 2018/10 2018/11 2018/12

    View Slide

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

    View Slide

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

    View Slide

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

    リリース
    2018/8 2018/9 2018/10 2018/11 2018/12

    View Slide

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

    View Slide

  65. リリース後のサイト

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  69. 次回やってみたいこと

    View Slide

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

    View Slide

  71. まとめ

    View Slide

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

    View Slide

  73. 最後に

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide