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

PHP 5.3 + CakePHP1.3 バージョンアップ報告

PHP 5.3 + CakePHP1.3 バージョンアップ報告

昨年お話ししました、ランサーズのPHP、CakePHPバージョンアップ宣言後の報告です。60万超ステップのサービスを、新規開発を止めずにリアルタイムにバージョンアップするノウハウや、PHP5.3 + CakePHP1.3 → PHP7、CakePHP3への適切なバージョンアップ順序、Dockerを利用したテスト工数の短縮についてお話しいたします。
PHP全般に関してはSREの金澤が、CakePHPのバージョンアップについてはアプリエンジニアの小林が発表しました。

Kanazawa Yuki

June 18, 2018
Tweet

More Decks by Kanazawa Yuki

Other Decks in Technology

Transcript

  1. 2018/6/16 PHPカンファレンス福岡 自己紹介 3 氏名:金澤 裕毅 出身:宮城県仙台市 ランサーズ入社:2013年11月 略歴: 大学時代はネットワークを専攻

    Windowsパッケージ開発(C++) ASP開発(Java)&インフラ(オンプレ) SNS開発(PHP)&インフラ(オンプレ) 現在はランサーズのSRE インフラチームから SREチームに
  2. 2018/6/16 PHPカンファレンス福岡 ランサーズのサーバー構成 App S3 ELB App CloudFront Cloud Search

    Route53 EC2 instance WebSocket ErastiCache Memcached ErastiCache Redis Aurora Reader Aurora Writer Api ELB Api EC2 EC2 instance ErastiCache Redis EC2 EC2 •Amazon Linux 2017.03 ◦PHP 5.3提供の最終バージョン •PHP 5.3.29 ◦CakePHP 1.3.6 ◦PECL ◦PEAR ◦Composer •Webサーバー ◦Nginx •Appサーバー ◦PHP-FPM こっちは Python ELB WebSocket
  3. 2018/6/16 PHPカンファレンス福岡 ランサーズの開発環境 Docker for Mac(Windows) docker exec 3306 9000

    Docker マウント SQLクライアント 開発環境(エディタ) ターミナル •Docker for Mac(Windows)で構築 ◦本番環境とほぼ同じ構成をDockerコンテナで再現 ◦DockerマウントでPCとソースを共有 ▪開発はPC上のエディタで行う Amazon ECR 10.10.6.11 App ランサーズ本体 10.100.106.5 WordPress コーポレート、ブログ 10.100.51.11 MySQL 10.100.6.131 WebSocket メッセージサービス データ入り
  4. 2018/6/16 PHPカンファレンス福岡 なぜ、バージョンアップするのか? •サポート終了 ◦PHP 5.3 ▪2015/11/01 1.3.21でサポート終了 ◦CakePHP1.3 ▪2014/08/14

    5.3.29でサポート終了 •バグ修正やカスタマイズを独自に行っている状態 ◦最新バージョンであれば貢献できる内容もc 昨年発表時 あれから1年経過
  5. 2018/6/16 PHPカンファレンス福岡 •サポート終了 ◦AWS SDK PHP ▪最新バージョンはPHP5.5以上 ◦Facebook SDK ▪最新バージョンはPHP5.4以上

    •旧バージョンのサポート終了が早い ▪PHP5.3サポートのfork版で対応中 •が、これもサポート終了 ◦手動で修正してしがみついている状態 ◦FireBase Admin SDK for PHP ▪PHP7.0以上 なぜ、バージョンアップするのか?
  6. 2018/6/16 PHPカンファレンス福岡 バージョンアップ条件の整理 PHP バージョン PHP キャッシュ CakePHP 対応バージョン Apache

    バージョン PHP5.3 APC CakePHP1.3 CakePHP2 Apache 2.2 PHP5.4 CakePHP1.3 CakePHP2 Apache 2.4 PHP5.5 OPCache APCu CakePHP1.3 CakePHP2 Apache 2.4 PHP5.6 OPCache APCu CakePHP1.3 CakePHP2 CakePHP3 Apache 2.4 PHP7.0 OPCache APCu CakePHP2 CakePHP3 Apache 2.4 Apacheも バージョン アップが必要 CakePHP 1.3は まともに動かない CakePHP 3 未サポート バージョンアップ 前の構成 json.soの インストールに問題 最も対応している PHPバージョン PHPとセットで インストールされる •Amazon Linux 2017.03で調査
  7. 2018/6/16 PHPカンファレンス福岡 Apache + mod_php → Nginx + PHP-FPMに •PHPをバージョンアップすると、Apacheも2.2→2.4になる

    ◦Apacheの設定も作り直しが必要 ▪それなら別の構成も検討したい •Nginx + PHP-FPMを採用 ◦※Nginxはソースでインストール ◦パフォーマンスの向上に期待していた ▪結果はレスポンス、サーバーリソース消費量もほぼ変わらず
  8. 2018/6/16 PHPカンファレンス福岡 開発用DockerコンテナをPHP 5.6に置き換えてみた 2017/06/08 01:38:06 [error] 12029#0: *87 FastCGI

    sent in stderr: "PHP message: PHP Strict Standards: Non-static method Configure::getInstance() should not be called statically in /var/www/lancers/cake/bootstrap.php on line 38 PHP message: PHP Strict Standards: Non-static method CakeLog::handleError() should not be called statically in /var/www/lancers/cake/libs/cake_log.php on line 290 PHP message: PHP Strict Standards: Non-static method CakeLog::handleError() should not be called statically in /var/www/lancers/cake/libs/debugger.php on line 707" while reading response header from upstream, client: 172.17.0.5, server: dev.lancers.jp, request: "GET /user/login?1496853486&ref=header_menu HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "dev.lancers.jp", referrer: http://dev.lancers.jp/ PHP message: PHP Warning: curl_setopt() expects parameter 2 to be long, string given in /var/www/lancers/app/vendors/AmazonSDK/lib/requestcore/requestcore.class.php on line 610 [08-Jun-2017 01:44:52] WARNING: [pool www] child 13007 said into stderr: "NOTICE: PHP message: PHP Strict Standards: Non-static method CakeLog::handleError() should not be called statically in /var/www/lancers/cake/libs/cake_log.php on line 290" [08-Jun-2017 01:44:52] WARNING: [pool www] child 13007 said into stderr: "NOTICE: PHP message: PHP Strict Standards: Non-static method CakeLog::handleError() should not be called statically in /var/www/lancers/cake/libs/debugger.php on line 707" [08-Jun-2017 01:44:52] WARNING: [pool www] child 13006 said into stderr: "NOTICE: PHP message: PHP Strict Standards: Non-static method Configure::getInstance() should not be called statically in /var/www/lancers/cake/bootstrap.php on line 38" 動いた! トップページは問題なし エラーログにWarningが多発 CakePHP1.3関連
  9. 2018/6/16 PHPカンファレンス福岡 SREチームで提案したバージョンアップ手順 PHP バージョン PHP キャッシュ CakePHP バージョン Webパッケージ

    バージョン(yum) PHP5.3 APC CakePHP1.3 Apache 2.2 + mod_php PHP5.3 APC CakePHP1.3 Nginx + PHP-FPM 5.3 PHP5.6 OPCache APCu CakePHP1.3 Nginx + PHP-FPM 5.6 PHP5.6 OPCache APCu CakePHP2 Nginx + PHP-FPM 5.6 PHP5.6 OPCache APCu CakePHP3 Nginx + PHP-FPM 5.6 PHP7.0 OPCache APCu CakePHP3 Nginx + PHP-FPM 7.0 Nginx + PHP-FPM に置き換え PHP 5.6まで 一気にバージョンアップ 最大の難関 カスタマイズ 問題を解決
  10. 2018/6/16 PHPカンファレンス福岡 アプリチームと相談して手順をさらに整理 1.3 → 2.8 2.8 → 2.9 2.9

    → 3.3 .. more 5.3 → 5.6 5.6 → 7.2 SRE担当 アプリ担当 SRE担当 アプリ担当 →
  11. 2018/6/16 PHPカンファレンス福岡 How To CakePHP1.3→CakePHP2.8 • Upgrade Shellの実行 • Upgrade

    Shellの実行だけでは動かない CakePHP2.0から2.8の差分を取り込んでいるわけでは なかった ↓ 変更点のドキュメントを2.0から読み直して修正点を まとめる
  12. 2018/6/16 PHPカンファレンス福岡 • HtmlHelper::link, FormHelper::selectの 仕様が変わっている ◦ 仕様に合わせたラッパークラスを作成して、 それを利用するようにテンプレートの修正 ▪

    HtmlHelper::linkはjavascript::confirm()でアラート表示する方 法が変わっていたり ▪ FormHelper::selectはselectedの指定方法が変更になっていたり ◦ その他にも修正点が多く時間がかかる How To CakePHP1.3→CakePHP2.8
  13. 2018/6/16 PHPカンファレンス福岡 工夫しているポイント • App::import → App::uses • new FooHelper()

    → new FooHelper(new View()) • new HogeComponent() → new HogeComponent(new ComponentCollection()) • new BarController() → new BarController( new CakeRequest(), new CakeResponse() ) • $this->params, $this->data等の参照変更 → $this->request->params, $this->request->data • その他多数 • オレオレUpgrade Shellを作って楽をする
  14. 2018/6/16 PHPカンファレンス福岡 工夫しているポイント • やること / やらないことを明確にする やること - 不要なコントローラやメソッド、ファイルがないか確

    認し削除可能であれば削除する - Notice, Warning撲滅 やらないこと - 開発速度とレビュー負荷軽減のためリファクタはしな い
  15. 2018/6/16 PHPカンファレンス福岡 バージョンアップチームの変遷 49 2017/2 プロジェクト始動 2017/6 Nginx + PHP-FPM化

    2017/7 CakePHP1.3→2.8化開始 2018/2 SRE専任1人 アプリ専任3人 次々と他PJに駆り出される •2018/3/31までにサービス側の99コントローラを移行予定だった ◦バージョンアップ専任メンバー3人体制でスタート ▪次々と他PJに駆り出される。。。
  16. 2018/6/16 PHPカンファレンス福岡 名前空間の一括修正 •コントローラー移行毎の対応だと漏れやすいので一括で対応 •PHPStormの活用 ◦Code -> Run Insepction by

    Nameを選択 ◦Undefined Classを選択 ◦Custom scopeの...を選択 ◦+を選択 ▪処理を実行したいフォルダを指定して新しいスコープを作る
  17. 2018/6/16 PHPカンファレンス福岡 57 SRE専任1人 アプリ専任3人 次々と他PJに駆り出される SREチームが引き取り 新卒も巻き込み総力体制 •専任メンバーの増員は無理 ◦片手間で手伝えるメンバーを都度集めることに

    ▪コントローラー移行手順をマニュアル化 2017/2 プロジェクト始動 2017/6 Nginx + PHP-FPM化 2017/7 CakePHP1.3→2.8化開始 2018/2 2018/4 2018/5 バージョンアップチームの変遷
  18. 2018/6/16 PHPカンファレンス福岡 CakePHP2.8バージョンアップの効果 60 •Cake Consoleの起動が早い ◦CakePHP2.8の起動速度がCakePHP1.3の約10倍に $ ./cake/console/cake -app

    ./app console Welcome to CakePHP v1.3.6 Console --------------------------------------------------------------- App : app Path: /var/www/lancers/./app --------------------------------------------------------------- Psy Shell v0.8.14 (PHP 5.3.29 — cli) by Justin Hileman New version is available (current: v0.8.14, latest: v0.9.4) From app/vendors/shells/console.php:22: 20| function main() 21| { > 22| eval(¥LUtils¥Debug::breakpoint()); 23| } 24| } >>> $ ./cake28/Console/cake console Welcome to CakePHP v2.8.9 Console --------------------------------------------------------------- App : cake28 Path: /var/www/lancers/cake28/ --------------------------------------------------------------- Psy Shell v0.8.14 (PHP 5.3.29 — cli) by Justin Hileman New version is available (current: v0.8.14, latest: v0.9.4) From cake28/Console/Command/ConsoleShell.php:16: 14| function main() 15| { > 16| eval(¥LUtils¥Debug::breakpoint()); 17| } 18| } >>> CakePHP1.3:約10秒 CakePHP2.8:約1秒
  19. 2018/6/16 PHPカンファレンス福岡 今後の展望 •PHP5.6化 ◦APC→OPCacheによる高速化 ◦新しい構文が使えることによる開発の高速化 ◦SDKのバージョンアップ ▪AWS SDK V3

    ▪FaceBook SDK最新版 •PHP7化 ◦さらなる高速化 ◦すべてのSDKが使えるようになる ▪FireBase Admin SDKも •CakePHP3化 ◦PHP 7.2 + CakePHP 2.10まで終わってから考える