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

ランサーズのCakePHP4化の取り組みについて

 ランサーズのCakePHP4化の取り組みについて

2021/10/3 PHPカンファレンスで発表した、スポンサーLTの資料です。

CakePHP2.10 → CakePHP4へのジャンプアップを取組中です。
CakePHP1.3→CakePHP2.8移行で行ったコントローラー単位移行の仕組みの応用や、現在の巨大リポジトリから機能別にCakePHP4プロジェクトに分割する試みを紹介します。

652359244199b2b5108a5e09c027e0da?s=128

Kanazawa Yuki

October 03, 2021
Tweet

Transcript

  1. 2021/10/3 PHPカンファレンス https://www.lancers.jp/ Yuki Kanazawa ランサーズのCakePHP4化の 取り組みについて

  2. 2021/10/3 PHPカンファレンス 自己紹介 2 氏名:金澤 裕毅 出身:宮城県仙台市 在住:北海道札幌市 Lancers, Inc.

    / Site Reliability Engineer (2013/11 -) 趣味: 将棋(ウォーズ初段、将棋倶楽部24で1000点くらい) Github:yKanazawa Twitter: @yakitori009 Language: C++, Java, PHP, Go
  3. 2021/10/3 PHPカンファレンス About Lancers 2017年時点 2019年時点 現在進行中 https://www.lancers.jp/ Genre: Crowdsourcing

    Start: 2008/4 PHP 5.2 → 5.3 → 5.6 → 7.3 CakePHP 1.2 → 1.3 → 2.8 → 2.10 → 4.x
  4. 2021/10/3 PHPカンファレンス CakePHP1.3と2.8の段階的移行 CakePHP1.3 CakePHP2.8 •共通ファイルCakePHP2.8側にもコピー ◦Componet ◦Helper ◦View •1コントローラーずつ移行

    ◦移行完了したものから本番リリース
  5. 2021/10/3 PHPカンファレンス CakePHP2 -> CakePHP3 バージョンアップ

  6. 2021/10/3 PHPカンファレンス CakePHP2とCakePHP3の違い •ORM ◦CakePHP2:連想配列 ◦CakePHP3:オブジェクト •その他たくさん ◦PSRへの準拠、ディレクトリ構造 ◦template 、モデルのないフォーム

    ◦※CakePHP3マイナーバージョン間でも大きな変更が度々あった •CakePHP1.3 -> CakePHP2とは比較にならないレベル ◦マイグレーションツールは実質使えない ◦ほぼ作り直しに等しい これが一番の問題 ほぼ作り直しなら この機会にリファクタリングも行ってしまう
  7. 2021/10/3 PHPカンファレンス CakePHP2と3共存バージョンアップ + cake28(app of CakePHP2) + Config +

    Controller + Lib + Model + Test + Vendor + cakephp + cakephp(CakePHP2.10) + View + vendor + cakephp + cakephp(CakePHP2.10) 移動 + cake28(app of CakePHP2) + Config + Controller + Lib + Model + Test + Vendor + cakephp + cakephp(CakePHP2.10) + View + vendor + cakephp + cakephp(CakePHP3.8) CakePHP3を インストール
  8. 2021/10/3 PHPカンファレンス CakePHP2と3共存バージョンアップ + config(config of CakePHP3) + .env +

    app.php + bootstrap.php + src(app of CakePHP3) + Controller + Lib + Model + cake28(app of CakePHP2) + Config(config of CakePHP2) + Controller + Lib + Model + Test(test of CakePHP2) + View + webroot(webroot of CakePHP2) + tests(test of CakePHP3) + webroot(webroot of CakePHP3) + index.php •CakePHP3のディレクトリ構造で初期設定 ◦config ◦src ▪Controller ▪Lib ▪Model ◦tests ◦webroot ▪index.php
  9. 2021/10/3 PHPカンファレンス CakePHP2 -> CakePHP3 Controllerの移行

  10. 2021/10/3 PHPカンファレンス CakePHP2 -> CakePHP3 Controllerの移行 + src(app of CakePHP3)

    + Controller + Lib + Model + cake28(app of CakePHP2) + Test(UT of CakePHP2) + webroot(webroot of CakePHP2) + index.php + tests(UT of CakePHP3) + vendor + cakephp + (CakePHP3.8) CakePHP2 Controller CakePHP2 Model CakePHP2 webroot CakePHP3 Table CakePHP3 Entity
  11. 2021/10/3 PHPカンファレンス CakePHP2 -> CakePHP3 Controllerの移行 + src(app of CakePHP3)

    + Controller + Lib + Model + cake28(app of CakePHP2) + Test(UT of CakePHP2) + webroot(webroot of CakePHP2) + index.php + tests(UT of CakePHP3) + vendor + cakephp + (CakePHP3.8) + webroot(webroot of CakePHP3) + index.php •CakePHP3のwebrootを追加 CakePHP2 Controller CakePHP2 Model CakePHP2 webroot CakePHP3 Table CakePHP3 Entity CakePHP3 webroot
  12. 2021/10/3 PHPカンファレンス Controller単位の移行の仕組みを構築 •cake28/config/switch.yml ◦CakePHP3へ転送するURIリストを記述 --- cakephp3: … - /mypage

    - /mypage/ - /mypage/index - /mypage/index/* - /mypage/charge - /mypage/charge/* … - /user/login - /user/login/* CakePHP2 Model CakePHP2 Controller CakePHP2 webroot CakePHP2 View CakePHP2 Lib CakePHP2 Table CakePHP3 Lib CakePHP3 Controller CakePHP3 webroot CakePHP3 View CakePHP3 Form
  13. 2021/10/3 PHPカンファレンス CakePHP2 -> CakePHP4 へのジャンプアップ

  14. 2021/10/3 PHPカンファレンス 2019/12にCakePHP4.0がリリース •CakePHP3とCakePHP4の主な変更点 ◦最低PHPバージョン ▪CakePHP3:PHP5.6以上 ▪CakePHP4:PHP7.2以上 ◦Templateディレクトリ ▪CakePHP3 :src/Template

    ▪CakePHP4 :templates ◦Templateファイルの拡張子変更 ▪CakePHP3 :ctp ▪CakePHP4 :php •CakePHP2 -> CakePHP3程の大きな変更はない ◦マイグレーションツールで移行できるレベル ▪※CakePHP3最新版でdeprecatedが出ない状態にしておく ◦ライブラリが一部追いついていない状態 ▪マイナーなCakePHPライブラリを使っている場合は注意
  15. 2021/10/3 PHPカンファレンス PHPUnit 5.7 と PHPUnit 8.4 を共存させる + cake28(app

    of CakePHP2) + Config + Controller + Lib + Model + Test + Vendor + phpunit(PHPUnit5.7) + View + vendor + phpunit(PHPUnit5.7) 移動 + cake28(app of CakePHP2) + Config + Controller + Lib + Model + Test + Vendor + phpunit(PHPUnit5.7) + View + vendor + phpunit(PHPUnit8.5) PHPUnit 8.5を インストール •CakePHP3とCakePHP4の主な変更点 ◦最低PHPUnitバージョン ▪CakePHP3:PHPUnit5以上 ▪CakePHP4:PHPUnit8.5以上
  16. 2021/10/3 PHPカンファレンス 管理画面とバッチの リポジトリ分離

  17. 2021/10/3 PHPカンファレンス PHP7.3 CakePHP2.10 lancers PHP7.3 CakePHP2.10 lancers PHP7.3 CakePHP2.10

    lancers 17 ランサーズのサーバー構成 EC2 instance CloudFront Route 53 ALB Auto Scaling App Aurora Reader Aurora Reader Aurora Writer ランサーズ Batch MySQL5.7 ALB Admin 管理画面 全て同じ リポジトリ
  18. 2021/10/3 PHPカンファレンス 18 管理画面とバッチのリポジトリを分離してCakePHP4で再構築 EC2 instance CloudFront Route 53 ALB

    Auto Scaling App Aurora Reader Aurora Reader Aurora Writer ランサーズ Batch MySQL5.7 ALB Admin 管理画面 PHP7.3 CakePHP4 lancers_admin PHP7.3 CakePHP2.10 lancers PHP7.3 CakePHP4 lancers_batch
  19. 2021/10/3 PHPカンファレンス サービス分割 CakePHP1.3 CakePHP2.8 •lancers_cakephpの巨大リポジトリから各機能を分離 ◦管理画面(CakePHP4で再構築) ◦バッチ(CakePHP4で再構築) ◦LP ◦その他

    巨大 リポジトリ Batch App Admin S3 S3 Lambda CakePHP4で 新規作成 CakePHP4で 新規作成
  20. 2021/10/3 PHPカンファレンス バッチの リポジトリ分離

  21. 2021/10/3 PHPカンファレンス •ShellクラスはCakePHP5で廃止 ◦ShellからCommandへの移行 コンソールコマンドの採用

  22. 2021/10/3 PHPカンファレンス 多重起動防止処理を共通クラスに実装 <?php declare(strict_types=1); namespace App¥Command; use Cake¥Console¥Command; use

    ReflectionClass; class BaseCommand extends Command { public $className; public $lockFileName; public $isLockfileExit = false; public function __construct() { parent::__construct(); $this->className = (new ReflectionClass($this))- >getShortName(); $this->lockFileName = TMP . $this->className . '.lock'; // ロックファイルのプロセスIDをチェック if ($this->checkLockFile()) { $this->isLockfileExit = true; exit; } // ロックファイルの作成 file_put_contents($this->lockFileName, getmypid()); } public function __destruct() { // プロセスがすでに存在して強制終了でなければ if (!$this->isLockfileExit) { // ロックファイルの削除 unlink($this->lockFileName); } } /* * ロックファイルのプロセスIDをチェック */ protected function checkLockFile(): bool { // ロックファイルの存在確認 if (!file_exists($this->lockFileName)) { return false; } // ファイル内に記載されているプロセスIDを取得 $pid = file_get_contents($this->lockFileName); $pid = str_replace(PHP_EOL, '', $pid); if (!is_numeric($pid)) { return false; } //取得したプロセスIDが動いていないかチェック $output = []; $cmd = "ps h " . $pid; exec($cmd, $output); if (isset($output[0])) { echo "Process already exist.¥n"; echo $output[0] . "¥n"; return true; } return false; } }
  23. 2021/10/3 PHPカンファレンス •現バッチ ◦独自の分岐処理を実装 •新バッチ ◦プラグインで分岐 ▪cakephp-master-replicaプラグイン •コネヒト社製 参照系DBへの切り替え Batch

    Writer Reader
  24. 2021/10/3 PHPカンファレンス 切り替え処理の自動化 •自動化の実装方法を、来週のCakeFestで話します(英語) ◦https://cakefest.org/tickets ◦10/8 21:30-22:00

  25. 2021/10/3 PHPカンファレンス 管理画面の リポジトリ分離

  26. 2021/10/3 PHPカンファレンス •CakePHP1.3ベース ◦手当たり次第にメニューを追加 ◦画面がはみ出てもお構いなし 昔の管理画面 細かすぎるメニュー!

  27. 2021/10/3 PHPカンファレンス •CakePHP用のAdminLTEプラグインを採用 新管理画面

  28. 2021/10/3 PHPカンファレンス •CakePHP用のAdminLTEプラグインを採用 新管理画面

  29. 2021/10/3 PHPカンファレンス CakePHP4関連のOSS活動

  30. 2021/10/3 PHPカンファレンス •CakePHP用AdminLTEプラグイン ◦ランサーズが最速でCakePHP4対応 AdminLTEのCakePHP4対応

  31. 2021/10/3 PHPカンファレンス •コネヒト社製プラグイン ◦ランサーズがCakePHP4対応 cakephp-master-replicaのCakePHP4対応

  32. 2021/10/3 PHPカンファレンス •CakePHP4ドキュメントの日本語訳 ◦cakephp/docs 28 Pull Requestsマージ済 cakephp/docsのCakePHP4日本語化

  33. 2021/10/3 PHPカンファレンス Thank You!