Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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年時点 現在

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13 text

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

Slide 14

Slide 14 text

2020/9/25 Connehito Marché Online 切り替え処理の共通化 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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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