$30 off During Our Annual Pro Sale. View Details »

ランサーズの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カンファレンス
    https://www.lancers.jp/
    Yuki Kanazawa
    ランサーズのCakePHP4化の
    取り組みについて

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  22. 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;
    }
    }

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide