Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

2021/10/3 PHPカンファレンス 自己紹介 2 氏名:金澤 裕毅 出身:宮城県仙台市 在住:北海道札幌市 Lancers, Inc. / Site Reliability Engineer (2013/11 -) 趣味: 将棋(ウォーズ初段、将棋倶楽部24で1000点くらい) Github:yKanazawa Twitter: @yakitori009 Language: C++, Java, PHP, Go

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

2021/10/3 PHPカンファレンス CakePHP1.3と2.8の段階的移行 CakePHP1.3 CakePHP2.8 ●共通ファイルCakePHP2.8側にもコピー ○Componet ○Helper ○View ●1コントローラーずつ移行 ○移行完了したものから本番リリース

Slide 5

Slide 5 text

2021/10/3 PHPカンファレンス CakePHP2 -> CakePHP3 バージョンアップ

Slide 6

Slide 6 text

2021/10/3 PHPカンファレンス CakePHP2とCakePHP3の違い ●ORM ○CakePHP2:連想配列 ○CakePHP3:オブジェクト ●その他たくさん ○PSRへの準拠、ディレクトリ構造 ○template 、モデルのないフォーム ○※CakePHP3マイナーバージョン間でも大きな変更が度々あった ●CakePHP1.3 -> CakePHP2とは比較にならないレベル ○マイグレーションツールは実質使えない ○ほぼ作り直しに等しい これが一番の問題 ほぼ作り直しなら この機会にリファクタリングも行ってしまう

Slide 7

Slide 7 text

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を インストール

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

2021/10/3 PHPカンファレンス CakePHP2 -> CakePHP3 Controllerの移行

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

2021/10/3 PHPカンファレンス CakePHP2 -> CakePHP4 へのジャンプアップ

Slide 14

Slide 14 text

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ライブラリを使っている場合は注意

Slide 15

Slide 15 text

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以上

Slide 16

Slide 16 text

2021/10/3 PHPカンファレンス 管理画面とバッチの リポジトリ分離

Slide 17

Slide 17 text

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 管理画面 全て同じ リポジトリ

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

2021/10/3 PHPカンファレンス サービス分割 CakePHP1.3 CakePHP2.8 ●lancers_cakephpの巨大リポジトリから各機能を分離 ○管理画面(CakePHP4で再構築) ○バッチ(CakePHP4で再構築) ○LP ○その他 巨大 リポジトリ Batch App Admin S3 S3 Lambda CakePHP4で 新規作成 CakePHP4で 新規作成

Slide 20

Slide 20 text

2021/10/3 PHPカンファレンス バッチの リポジトリ分離

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

2021/10/3 PHPカンファレンス 多重起動防止処理を共通クラスに実装 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; } }

Slide 23

Slide 23 text

2021/10/3 PHPカンファレンス ●現バッチ ○独自の分岐処理を実装 ●新バッチ ○プラグインで分岐 ■cakephp-master-replicaプラグイン ●コネヒト社製 参照系DBへの切り替え Batch Writer Reader

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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