2021/10/3 PHPカンファレンスで発表した、スポンサーLTの資料です。
CakePHP2.10 → CakePHP4へのジャンプアップを取組中です。 CakePHP1.3→CakePHP2.8移行で行ったコントローラー単位移行の仕組みの応用や、現在の巨大リポジトリから機能別にCakePHP4プロジェクトに分割する試みを紹介します。
2021/10/3 PHPカンファレンスhttps://www.lancers.jp/Yuki KanazawaランサーズのCakePHP4化の取り組みについて
View Slide
2021/10/3 PHPカンファレンス自己紹介 2氏名:金澤 裕毅出身:宮城県仙台市 在住:北海道札幌市Lancers, Inc. / Site Reliability Engineer (2013/11 -)趣味: 将棋(ウォーズ初段、将棋倶楽部24で1000点くらい)Github:yKanazawaTwitter: @yakitori009Language: C++, Java, PHP, Go
2021/10/3 PHPカンファレンスAbout Lancers2017年時点 2019年時点現在進行中https://www.lancers.jp/Genre: CrowdsourcingStart: 2008/4PHP5.2 → 5.3 → 5.6 → 7.3CakePHP1.2 → 1.3 → 2.8 → 2.10 → 4.x
2021/10/3 PHPカンファレンスCakePHP1.3と2.8の段階的移行CakePHP1.3CakePHP2.8●共通ファイルCakePHP2.8側にもコピー○Componet○Helper○View●1コントローラーずつ移行○移行完了したものから本番リリース
2021/10/3 PHPカンファレンスCakePHP2 -> CakePHP3バージョンアップ
2021/10/3 PHPカンファレンスCakePHP2とCakePHP3の違い●ORM○CakePHP2:連想配列○CakePHP3:オブジェクト●その他たくさん○PSRへの準拠、ディレクトリ構造○template 、モデルのないフォーム○※CakePHP3マイナーバージョン間でも大きな変更が度々あった●CakePHP1.3 -> CakePHP2とは比較にならないレベル○マイグレーションツールは実質使えない○ほぼ作り直しに等しいこれが一番の問題ほぼ作り直しならこの機会にリファクタリングも行ってしまう
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をインストール
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
2021/10/3 PHPカンファレンスCakePHP2 -> CakePHP3Controllerの移行
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)CakePHP2ControllerCakePHP2ModelCakePHP2webrootCakePHP3TableCakePHP3Entity
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を追加CakePHP2ControllerCakePHP2ModelCakePHP2webrootCakePHP3TableCakePHP3EntityCakePHP3webroot
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/*CakePHP2ModelCakePHP2ControllerCakePHP2webrootCakePHP2ViewCakePHP2LibCakePHP2TableCakePHP3LibCakePHP3ControllerCakePHP3webrootCakePHP3ViewCakePHP3Form
2021/10/3 PHPカンファレンスCakePHP2 -> CakePHP4へのジャンプアップ
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ライブラリを使っている場合は注意
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以上
2021/10/3 PHPカンファレンス管理画面とバッチのリポジトリ分離
2021/10/3 PHPカンファレンスPHP7.3CakePHP2.10lancersPHP7.3CakePHP2.10lancersPHP7.3CakePHP2.10lancers17ランサーズのサーバー構成EC2instanceCloudFront Route 53ALBAutoScaling AppAuroraReaderAuroraReaderAuroraWriterランサーズBatchMySQL5.7ALBAdmin管理画面全て同じリポジトリ
2021/10/3 PHPカンファレンス18管理画面とバッチのリポジトリを分離してCakePHP4で再構築EC2instanceCloudFront Route 53ALBAutoScaling AppAuroraReaderAuroraReaderAuroraWriterランサーズBatchMySQL5.7ALBAdmin管理画面PHP7.3CakePHP4lancers_adminPHP7.3CakePHP2.10lancersPHP7.3CakePHP4lancers_batch
2021/10/3 PHPカンファレンスサービス分割CakePHP1.3CakePHP2.8●lancers_cakephpの巨大リポジトリから各機能を分離○管理画面(CakePHP4で再構築)○バッチ(CakePHP4で再構築)○LP○その他巨大リポジトリBatchAppAdminS3S3LambdaCakePHP4で新規作成CakePHP4で新規作成
2021/10/3 PHPカンファレンスバッチのリポジトリ分離
2021/10/3 PHPカンファレンス●ShellクラスはCakePHP5で廃止○ShellからCommandへの移行コンソールコマンドの採用
2021/10/3 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;}}
2021/10/3 PHPカンファレンス●現バッチ○独自の分岐処理を実装●新バッチ○プラグインで分岐■cakephp-master-replicaプラグイン●コネヒト社製参照系DBへの切り替えBatchWriter Reader
2021/10/3 PHPカンファレンス切り替え処理の自動化●自動化の実装方法を、来週のCakeFestで話します(英語)○https://cakefest.org/tickets○10/8 21:30-22:00
2021/10/3 PHPカンファレンス管理画面のリポジトリ分離
2021/10/3 PHPカンファレンス●CakePHP1.3ベース○手当たり次第にメニューを追加○画面がはみ出てもお構いなし昔の管理画面細かすぎるメニュー!
2021/10/3 PHPカンファレンス●CakePHP用のAdminLTEプラグインを採用新管理画面
2021/10/3 PHPカンファレンスCakePHP4関連のOSS活動
2021/10/3 PHPカンファレンス●CakePHP用AdminLTEプラグイン○ランサーズが最速でCakePHP4対応AdminLTEのCakePHP4対応
2021/10/3 PHPカンファレンス●コネヒト社製プラグイン○ランサーズがCakePHP4対応cakephp-master-replicaのCakePHP4対応
2021/10/3 PHPカンファレンス●CakePHP4ドキュメントの日本語訳○cakephp/docs 28 Pull Requestsマージ済cakephp/docsのCakePHP4日本語化
2021/10/3 PHPカンファレンスThank You!