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プロジェクトに分割する試みを紹介します。

Kanazawa Yuki

October 03, 2021
Tweet

More Decks by Kanazawa Yuki

Other Decks in Programming

Transcript

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

    / Site Reliability Engineer (2013/11 -) 趣味: 将棋(ウォーズ初段、将棋倶楽部24で1000点くらい) Github:yKanazawa Twitter: @yakitori009 Language: C++, Java, PHP, Go
  2. 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
  3. 2021/10/3 PHPカンファレンス CakePHP2とCakePHP3の違い •ORM ◦CakePHP2:連想配列 ◦CakePHP3:オブジェクト •その他たくさん ◦PSRへの準拠、ディレクトリ構造 ◦template 、モデルのないフォーム

    ◦※CakePHP3マイナーバージョン間でも大きな変更が度々あった •CakePHP1.3 -> CakePHP2とは比較にならないレベル ◦マイグレーションツールは実質使えない ◦ほぼ作り直しに等しい これが一番の問題 ほぼ作り直しなら この機会にリファクタリングも行ってしまう
  4. 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を インストール
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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ライブラリを使っている場合は注意
  10. 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以上
  11. 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 管理画面 全て同じ リポジトリ
  12. 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
  13. 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; } }