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

ランサーズの CakePHP4移行について

Kanazawa Yuki
September 25, 2020

ランサーズの CakePHP4移行について

2020/9/18に行われたオンライン勉強会
https://connehito.connpass.com/event/187729/
で発表した資料です。

最近のCakePHP4バージョンアップの取り組みについて発表させていただきました。

Kanazawa Yuki

September 25, 2020
Tweet

More Decks by Kanazawa Yuki

Other Decks in Programming

Transcript

  1. 2020/9/25 Connehito Marché Online
    ランサーズの
    CakePHP4移行について
    https://www.lancers.jp/

    View Slide

  2. 2020/9/25 Connehito Marché Online
    自己紹介 2
    氏名:金澤 裕毅
    出身:宮城県仙台市
    Lancers, Inc. / Site Reliability Engineer (2013/11 -)
    趣味: 将棋(ウォーズ初段、将棋倶楽部24で1000点くらい)
    Github:yKanazawa
    Twitter: @yakitori009
    Language: C++, Java, PHP, Go

    View Slide

  3. 2020/9/25 Connehito Marché Online
    About Lancers
    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
    2017年時点 現在

    View Slide

  4. 2020/9/25 Connehito Marché Online
    PHPバージョンアップの歴史

    View Slide

  5. 2020/9/25 Connehito Marché Online
    ランサーズのPHPバージョンアップの歴史
    1.3 -> 2.8
    2.8 -> 2.10
    2.10 -> 4.x .. more
    5.3 -> 5.6
    5.6 -> 7.3
    ->
    PHP5.6
    requires
    2017/6/6
    2 months
    1.7 year
    2019/2/5
    1.8 month
    2019/3/27
    2019/3/28
    1 day
    2019/5/28
    2 months
    CakePHP2.10
    requires
    PHP7.3
    requires

    View Slide

  6. 2020/9/25 Connehito Marché Online
    ソースコードの分離

    View Slide

  7. 2020/9/25 Connehito Marché Online
    Pruduct scale (https://www.lancers.jp/)
    files steps
    Config 190 60000
    Console 170 30000
    Controller 350 110000
    Lib 1100 153000
    Model 420 105000
    View 2800 240000
    All 5030 698000

    View Slide

  8. 2020/9/25 Connehito Marché Online
    PHP7.3
    CakePHP2.10
    lancers
    PHP7.3
    CakePHP2.10
    lancers
    PHP7.3
    CakePHP2.10
    lancers
    8
    ランサーズのサーバー構成
    EC2
    instance
    CloudFront Route 53
    ALB
    Auto
    Scaling App
    Aurora
    Reader
    Aurora
    Reader
    Aurora
    Writer
    ランサーズ
    Batch
    MySQL5.7
    ALB
    Admin
    管理画面
    全て同じ
    リポジトリ

    View Slide

  9. 2020/9/25 Connehito Marché Online
    サービス分割
    CakePHP1.3
    CakePHP2.8
    ●lancers_cakephpの巨大リポジトリから各機能を分離
    ○管理画面(CakePHP4で再構築)
    ○バッチ(CakePHP4で再構築)
    ○LP
    ○その他
    巨大
    リポジトリ
    Batch
    App
    Admin
    S3
    S3
    Lambda
    CakePHP4で
    新規作成
    CakePHP4で
    新規作成

    View Slide

  10. 2020/9/25 Connehito Marché Online
    バッチの
    リポジトリ分離

    View Slide

  11. 2020/9/25 Connehito Marché Online
    ●ShellクラスはCakePHP5で廃止
    ○ShellからCommandへの移行
    コンソールコマンドの採用

    View Slide

  12. 2020/9/25 Connehito Marché Online
    多重起動防止処理を共通クラスに実装
    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

  13. 2020/9/25 Connehito Marché Online
    ●現バッチ
    ○独自の分岐処理を実装
    ●新バッチ
    ○プラグインで分岐
    ■cakephp-master-replicaプラグイン
    ●コネヒト社製
    参照系DBへの切り替え
    Batch
    Writer Reader

    View Slide

  14. 2020/9/25 Connehito Marché Online
    切り替え処理の共通化
    declare(strict_types=1);
    namespace App¥Model¥Table;
    use Cake¥Datasource¥EntityInterface;
    use Cake¥ORM¥Query;
    use Cake¥ORM¥Table;
    abstract class BaseTable extends Table
    {
    public function __call($method, $args)
    {
    if (preg_match('/^find(?:¥w+)?By/', $method) > 0) {
    $this->getConnection()->switchRole('replica');
    $result = parent::__call($method, $args);
    $this->getConnection()->switchRole('master');
    return $result;
    }
    return parent::__call($method, $args);
    }
    public function find(string $type = 'all', array $options = []): Query
    {
    $this->getConnection()->switchRole('replica');
    $result = parent::find($type, $options);
    $this->getConnection()->switchRole('master');
    return $result;
    }

    ●Tableクラスの以下の関数をオーバーライド
    ○__call
    ○find
    ○findAll
    ○findList
    ○findThreaded
    ○get

    View Slide

  15. 2020/9/25 Connehito Marché Online
    管理画面の
    リポジトリ分離

    View Slide

  16. 2020/9/25 Connehito Marché Online
    ●CakePHP1.3ベース
    ○手当たり次第にメニューを追加
    ○画面がはみ出てもお構いなし
    昔の管理画面
    細かすぎるメニュー!

    View Slide

  17. 2020/9/25 Connehito Marché Online
    ●CakePHP1.3ベース
    ○メニューをまとめる
    ○画面の調整
    管理画面のプチリニューアル

    View Slide

  18. 2020/9/25 Connehito Marché Online
    ●CakePHP1.3ベース
    ○新しい画面からBootstrapで作るようになった
    ○デザインが統一されていないという問題も。。
    Bootstrapの導入
    経理系画面で導入した新UI

    View Slide

  19. 2020/9/25 Connehito Marché Online
    ●CakePHP用のAdminLTEプラグインを採用
    新管理画面

    View Slide

  20. 2020/9/25 Connehito Marché Online
    ●CakePHP用のAdminLTEプラグインを採用
    新管理画面

    View Slide

  21. 2020/9/25 Connehito Marché Online
    CakePHP4関連のOSS活動

    View Slide

  22. 2020/9/25 Connehito Marché Online
    ●CakePHP用AdminLTEプラグイン
    ○ランサーズが最速でCakePHP4対応
    AdminLTEのCakePHP4対応

    View Slide

  23. 2020/9/25 Connehito Marché Online
    ●コネヒト社製プラグイン
    ○ランサーズがCakePHP4対応
    cakephp-master-replicaのCakePHP4対応

    View Slide

  24. 2020/9/25 Connehito Marché Online
    ●CakePHP4ドキュメントの日本語訳
    ○cakephp/docs 28 Pull Requestsマージ済
    cakephp/docsのCakePHP4日本語化

    View Slide

  25. 2020/9/25 Connehito Marché Online
    Thank You!

    View Slide