Slide 1

Slide 1 text

CakePHP2、4混在環境の PHP8.1バージョンアップ 2022.08.27 PHPカンファレンス沖縄 2022.08.27 PHPカンファレンス沖縄

Slide 2

Slide 2 text

⾃⼰紹介 金澤 裕毅 - 出身:宮城県仙台市 - 在住:北海道札幌市 - 2013年11月にランサーズSREとしてJOIN - 2017年からPHPのバージョンアップ担当 - 趣味:将棋(ウォーズ二段)、バドミントン - Github:yKanazawa - Twitter: @yakitori009 - Language: C++, Java, PHP, Go 2022.08.27 PHPカンファレンス沖縄

Slide 3

Slide 3 text

ランサーズの事業概要 2022.08.27 PHPカンファレンス沖縄

Slide 4

Slide 4 text

ランサーズとは? 日本における「フリーランスプラットフォーム」のパイオニア クラウドソーシングの基本的なモデル グローバルでのクラウドソーシングプレーヤー 経営資源の オープン化 企業 (クライアント) 働き方の 柔軟化・多様化 個人 (ランサー) 2015 2009 2008 作業・納品 エスクロー決済 Upwork (アップワーク) 旧Elance+ODesk Freelancer.com (フリーランサー・ドットコム) Elance 1998 ODesk 2004 2022.08.27 PHPカンファレンス沖縄

Slide 5

Slide 5 text

ランサーズのサービスマップ 2022.08.27 PHPカンファレンス沖縄 対フリーランス向け サービス 対クライアント向け サービス メンタリング 仕事マッチング 教育 人材紹介 コンサル領域

Slide 6

Slide 6 text

従業員体験もオフィスも2.0の世界へ ⽇々進化する 全社集会 完全リモート化へ (リモート率 90%) オフィスのあり⽅も今後検討していく 2022.08.27 PHPカンファレンス沖縄

Slide 7

Slide 7 text

PHPバージョンアップの歴史 2022.08.27 PHPカンファレンス沖縄

Slide 8

Slide 8 text

バージョンアップの歴史 2022.08.27 PHPカンファレンス沖縄 1.3 → 2.8 2.8 → 2.10 2.10→ 4.x .. more 5.3 → 5.6 5.6 → 7.3 2017/3 バージョンアップ開始 2019/2/5完了 約2年 PHP5.6に必須 CakePHP2.10に必須 PHP7.3に必須 2019/3/27完了 約2カ⽉ 2019/4/17完了 約1⽇ 2019/5/28完了 約1.5カ⽉ 現在継続中 1.3 5.3 +

Slide 9

Slide 9 text

ランサーズのサーバー構成(2019年頃) PHP7.3 CakePHP2.10 lancers PHP7.3 CakePHP2.10 lancers PHP7.3 CakePHP2.10 lancers EC2 instance CloudFront Route 53 ALB Auto Scaling App Aurora Reader Aurora Reader Aurora Writer ランサーズ Batch MySQL5.7 ALB Admin 管理画⾯ 全て同じ リポジトリ S3 CloudFront API Gateway Lambda サムネイル表⽰ ElastiCache Redis 2022.08.27 PHPカンファレンス沖縄

Slide 10

Slide 10 text

リポジトリを分離してCakePHP4で再構築 PHP7.3 CakePHP4 Lancers_admin PHP7.3 CakePHP2.10 lancers PHP7.3 CakePHP4 Lancers_batch EC2 instance CloudFront Route 53 ALB Auto Scaling App Aurora Reader Aurora Reader Aurora Writer ランサーズ Batch MySQL5.7 ALB Admin 管理画⾯ S3 CloudFront API Gateway Lambda サムネイル表⽰ ElastiCache Redis 2022.08.27 PHPカンファレンス沖縄

Slide 11

Slide 11 text

本番環境のコンテナ化 2022.08.27 PHPカンファレンス沖縄

Slide 12

Slide 12 text

本番環境をコンテナ化(2022年現在) PHP7.3 CakePHP4.3 PHP7.3 CakePHP2.10 PHP7.3 CakePHP4.3 EC2 instance CloudFront Route 53 ALB Auto Scaling App Aurora Reader Aurora Reader Aurora Writer ランサーズ Batch (Scheduling Task) ALB Admin 管理画⾯ Fargate CloudWatch Logs AWS Logsで転送 Kinesis Firehose S3 CloudFront API Gateway Lambda サムネイル表⽰ ElastiCache Redis デプロイ 2022.08.27 PHPカンファレンス沖縄

Slide 13

Slide 13 text

本番コンテナ化により得られるメリット Docker化前 Docker化後 ソースコードのリリース 独⾃のデプロイシステムで⼿動 リリース マージ後にCIで⾃動リリース 本番サーバーの設定変更 ansibleで差分更新 Dockerfileで常に新規構築 デプロイ時間 30秒以内 5分程度 オートスケーリング時の処理 EC2のAMI起動後にデプロイシ ステムから最新のソースを取得 常に最新のソースで起動 Immutable Infrastructure化で バージョンアップしやすい体制に 2022.08.27 PHPカンファレンス沖縄

Slide 14

Slide 14 text

Batchと管理画⾯からPHP8.1対応 PHP7.3 CakePHP4.3 PHP7.3 CakePHP2.10 PHP7.3 CakePHP4.3 EC2 instance CloudFront Route 53 ALB Auto Scaling App Aurora Reader Aurora Reader Aurora Writer ランサーズ Batch (Scheduling Task) ALB Admin 管理画⾯ Fargate CloudWatch Logs AWS Logsで転送 Kinesis Firehose S3 CloudFront API Gateway Lambda サムネイル表⽰ ElastiCache Redis デプロイ 2022.08.27 PHPカンファレンス沖縄

Slide 15

Slide 15 text

PHP8.1コンテナの構築 2022.08.27 PHPカンファレンス沖縄

Slide 16

Slide 16 text

Amazon Linux2コンテナをベースに構築 ・EC2時代と同じOS ・互換性の高さを重視 ・awslogs ・yumでインストール可能 ・PHP8.1 ・yumのデフォルトリポジトリには存在しない ・remiリポジトリからインストール 2022.08.27 PHPカンファレンス沖縄

Slide 17

Slide 17 text

⼀部のメンバーから開発環境がビルドできない報告あり 2022.08.27 PHPカンファレンス沖縄

Slide 18

Slide 18 text

remiリポジトリがaarch64⾮対応 ・x86_64 ・remi7:http://rpms.remirepo.net/enterprise/7/remi/x86_64/repoview/ ・PHP8.1のパッケージあり ・remi8:http://rpms.remirepo.net/enterprise/8/remi/x86_64/repoview/ ・PHP8.1のパッケージあり ・aarch64 ・remi7:http://rpms.remirepo.net/enterprise/7/remi/aarch64/repoview/ ・PHP8.1のパッケージなし ・remi8:http://rpms.remirepo.net/enterprise/8/remi/aarch64/repoview/ ・このURL自体存在しない 2022.08.27 PHPカンファレンス沖縄 →remiが今後aarch64に対応する見込みは薄そう ・https://forum.remirepo.net/viewtopic.php?id=4016

Slide 19

Slide 19 text

対応⽅法 ・Docker Buildをやめる ・x86_64で構築済のコンテナをECRにアップロード ・それを取得して使ってもらう ・※Docker for Macのエミュレーション機能で対応 ・本番環境でAWSのArm系プロセッサは使えない ・Amazon Linux2をやめる ・他のLinux系コンテナで構築する 2022.08.27 PHPカンファレンス沖縄

Slide 20

Slide 20 text

オフィシャルのPHPコンテナをベースに構築 ・Alpineベース ・PHPをDockerで運用するなら一番メジャーな選択 ・Arm64にも対応 ・awslogsのインストールが困難 ・インストールスクリプトがAlpineに未対応 2022.08.27 PHPカンファレンス沖縄

Slide 21

Slide 21 text

Ubuntuのコンテナをベースに構築 ・apt installでPHP8.1インストール可能 ・awslogsのインストール可能 ・インストールスクリプトのサポートがPython2.6~3.5 ・UbuntuのPython3はバージョン3.10 →今回はPython2.7を別途インストールして対応 2022.08.27 PHPカンファレンス沖縄

Slide 22

Slide 22 text

PHP8.1化に伴うコード修正 2022.08.27 PHPカンファレンス沖縄

Slide 23

Slide 23 text

PHPCompatibilityによる静的解析 2022.08.27 PHPカンファレンス沖縄 ・PHP CodeSnifferの Coding Standard ・指定したPHPバージョン に対する互換性をチェック

Slide 24

Slide 24 text

PHPCompatibilityによる静的解析 root@batch:/var/www/lancers_batch# bin/phpcs -p src/ --standard=PHPCompatibility --untime-set testVersion 8.1 ................................W........................... 60 / 596 (10%) … ............................................................ 540 / 596 (91%) ........................................................ 596 / 596 (100%) FILE: /var/www/lancers_batch/src/Command/InsertAggregatedImpressionLogsCommand.php ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---- FOUND 0 ERRORS AND 4 WARNINGS AFFECTING 4 LINES ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---- 118 | WARNING | Method name "InsertAggregatedImpressionLogsCommand::__insertAggregatedImpressionLogs" is discouraged; PHP has reserved all method names with a double underscore prefix | | for future use. 186 | WARNING | Method name "InsertAggregatedImpressionLogsCommand::__dateValidations" is discouraged; PHP has reserved all method names with a double underscore prefix for future use. 208 | WARNING | Method name "InsertAggregatedImpressionLogsCommand::__arrayCsvTextToArray" is discouraged; PHP has reserved all method names with a double underscore prefix for future | | use. 322 | WARNING | Method name "InsertAggregatedImpressionLogsCommand::__isPositeveInteger" is discouraged; PHP has reserved all method names with a double underscore prefix for future use. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---- … ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---- FOUND 1 ERROR AFFECTING 1 LINE ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---- 354 | ERROR | Since PHP 7.0, functions inspecting arguments, like debug_backtrace(), no longer report the original value as passed to a parameter, but will instead provide the current | | value. The parameter "$className" was changed on line 351. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---- Time: 16.81 secs; Memory: 18MB 2022.08.27 PHPカンファレンス沖縄

Slide 25

Slide 25 text

Rectorで最新の記法に⾃動修正 2022.08.27 PHPカンファレンス沖縄 ・自動アップグレードツール ・CakePHPのVerUpでも利用

Slide 26

Slide 26 text

Rectorで最新の記法に⾃動修正 composer require rector/rector --dev vendor/bin/rector init paths([ __DIR__ . '/config', __DIR__ . '/src', __DIR__ . '/templates’, __DIR__ . '/tests', ]); $rectorConfig->sets([ LevelSetList::UP_TO_PHP_81, ]); $rectorConfig->rule(InlineConstructorDefaultToPropertyRector::class); }; 2022.08.27 PHPカンファレンス沖縄 bin/rector process src/ templates/ ・セットアップ ・rector.phpを生成 ・rectorコマンドの実行 ・rector.phpのカスタマイズ PHPのバージョンを指定

Slide 27

Slide 27 text

CakePHP2に対するアプローチ 2022.08.27 PHPカンファレンス沖縄

Slide 28

Slide 28 text

CakePHPとPHPのサポートバージョン PHP Min ver PHP Max ver PHPUnit Min ver PHPUnit Max ver CakePHP 2.10 5.3 7.4 3.7 5.7.* CakePHP4.3 7.2 8.* 8.5.0 9.* CakePHP4.4 7.4 8.* 8.5.0 9.* 2022.08.27 PHPカンファレンス沖縄

Slide 29

Slide 29 text

ランサーズ本体のPHP8.1対応 PHP7.3 CakePHP2.10 + CakePHP4.3 PHP7.3 → 8.1 CakePHP4.3 EC2 instance CloudFront Route 53 ALB Auto Scaling App Aurora Reader Aurora Reader Aurora Writer ランサーズ Batch (Scheduling Task) ALB Admin 管理画⾯ Fargate CloudWatch Logs AWS Logsで転送 Kinesis Firehose S3 CloudFront API Gateway Lambda サムネイル表⽰ ElastiCache Redis デプロイ 2022.08.27 PHPカンファレンス沖縄 PHP7.3 → 8.1 CakePHP4.3

Slide 30

Slide 30 text

CakePHP2とCakePHP4の混在環境 + App + Config + Controller + Lib + Model + Test + Vendor + cakephp + cakephp + debug_kit + phpunit + View + config + src + tests + vendor + cakephp + cakephp + debug_kit + phpunit + webroot CakePHP2 CakePHP4 CakePHP2.10 git管理 CakePHP4.3 Composer管理 PHPUnit5.7 git管理 PHPUnit9 Composer管理 2022.08.27 PHPカンファレンス沖縄

Slide 31

Slide 31 text

CakePHP2とCakePHP4の混在環境 + App + Config + switch.yml + Controller + Lib + Model + Test + Vendor + View + config + app.php + bootstrap.php + src + Controller + Lib + Model + tests + vendor + webroot --- cakephp4: … - /mypage - /mypage/ - /mypage/index - /mypage/index/* - /mypage/charge - /mypage/charge/* … - /user/login - /user/login/* ここに列挙したパスのみ CakePHP4で処理する CakePHP2 CakePHP4 2022.08.27 PHPカンファレンス沖縄

Slide 32

Slide 32 text

PHP8に対応したCakePHP2 ・CakePHP2をforkしてPHP8対応 ・PHP8.1での動作報告もあり 2022.08.27 PHPカンファレンス沖縄

Slide 33

Slide 33 text

PHP8対応版CakePHP2に置き換え + App + Config + Controller + Lib + Model + Test + Vendor + cakephp + cakephp + debug_kit + phpunit + View + config + src + tests + vendor + cakephp + cakephp + debug_kit + phpunit + webroot CakePHP2 CakePHP4 PHP8対応版 CakePHP2 CakePHP4.3 Composer管理 PHPUnit5.7 git管理 PHPUnit9 Composer管理 2022.08.27 PHPカンファレンス沖縄

Slide 34

Slide 34 text

課題:PHPUnit5.7はPHP8.1に対応するのか? + App + Config + Controller + Lib + Model + Test + Vendor + cakephp + cakephp + debug_kit + phpunit + View + config + src + tests + vendor + cakephp + cakephp + debug_kit + phpunit + webroot CakePHP2 CakePHP4 PHP8対応版 CakePHP2 CakePHP4.3 Composer管理 PHPUnit5.7︖ PHPUnit9 Composer管理 2022.08.27 PHPカンファレンス沖縄

Slide 35

Slide 35 text

お知らせ 2022.08.27 PHPカンファレンス沖縄

Slide 36

Slide 36 text

バージョンアップ協⼒者募集中! 進捗 管理画⾯ CakePHP4 約75% バッチ CakePHP4 約50% 本体 CakePHP2 + CakePHP4 これから 2022.08.27 PHPカンファレンス沖縄 ・ランサーズの時間報酬で直接依頼します ・PHPCon参加者による副業実績あり 移⾏中

Slide 37

Slide 37 text

We are Hiring!! 一緒に新しい「働く」体験を作りましょう! ランサーズ 採用