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

652359244199b2b5108a5e09c027e0da?s=47 Kanazawa Yuki
September 25, 2020

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

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

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

652359244199b2b5108a5e09c027e0da?s=128

Kanazawa Yuki

September 25, 2020
Tweet

Transcript

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

  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
  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年時点 現在
  4. 2020/9/25 Connehito Marché Online PHPバージョンアップの歴史

  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
  6. 2020/9/25 Connehito Marché Online ソースコードの分離

  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
  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 管理画面 全て同じ リポジトリ
  9. 2020/9/25 Connehito Marché Online サービス分割 CakePHP1.3 CakePHP2.8 •lancers_cakephpの巨大リポジトリから各機能を分離 ◦管理画面(CakePHP4で再構築) ◦バッチ(CakePHP4で再構築)

    ◦LP ◦その他 巨大 リポジトリ Batch App Admin S3 S3 Lambda CakePHP4で 新規作成 CakePHP4で 新規作成
  10. 2020/9/25 Connehito Marché Online バッチの リポジトリ分離

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

  12. 2020/9/25 Connehito Marché Online 多重起動防止処理を共通クラスに実装 <?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; } }
  13. 2020/9/25 Connehito Marché Online •現バッチ ◦独自の分岐処理を実装 •新バッチ ◦プラグインで分岐 ▪cakephp-master-replicaプラグイン •コネヒト社製

    参照系DBへの切り替え Batch Writer Reader
  14. 2020/9/25 Connehito Marché Online 切り替え処理の共通化 <?php 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
  15. 2020/9/25 Connehito Marché Online 管理画面の リポジトリ分離

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

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

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

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

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

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

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

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

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

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