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 自己紹介 2 氏名:金澤 裕毅 出身:宮城県仙台市 Lancers,

    Inc. / Site Reliability Engineer (2013/11 -) 趣味: 将棋(ウォーズ初段、将棋倶楽部24で1000点くらい) Github:yKanazawa Twitter: @yakitori009 Language: C++, Java, PHP, Go
  2. 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年時点 現在
  3. 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
  4. 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
  5. 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 管理画面 全て同じ リポジトリ
  6. 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; } }
  7. 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