📘

CakePHP2からCakePHP4へのバージョンアップ 〜其の2 Cake2とCake4の共存環境編〜

2022/09/28に公開

はじめに

こんにちは。株式会社ペライチ のエンジニアリングマネージャーの三井と申します。
ペライチではオフショア開発の立ち上げからオフショアでの開発プロジェクト推進をしています。オフショアの概要につきましては以下に簡単な紹介記事がございますので合わせてお読みいただけますと幸いです。

https://qiita.com/mitsui_peraichi/items/a13bee395da3281c8622

ペライチでは保守開発として、昨年より現行 CakePHP2 から CakePHP4 へのバージョンアップを行っておりましたが、今春に無事完了致しました💪。
バージョンアップ完了にあたり、CEOの香月がPHPerKaigiに登壇し、本件について熱く語っておりますのでこちらもご覧ください(こちらは主にマネジメントの話が中心です)。

https://zenn.dev/peraichi/articles/01g0b306qhwymk102bqekpxrxf

このシリーズではバージョンアップ作業の中で発生した技術的課題とそのアプローチ方法などを抜粋して紹介させていただきます。
前回から結構期間が開いてしまったのですが本記事はシリーズ第二弾となります。以下第一弾も合わせてチェックしてみてください。

https://zenn.dev/peraichi/articles/01fwfv1gwx4jnzdhst2cw0afrv

移行方針と技術的課題

前回もお話しましたが今回の CakePHP のバージョンアップにおきましては、既存の開発をとめずに移行します。そのため方式として以下の通り単一リポジトリ内に CakePHP 2 と CakePHP4 の2つのフレームワークを共存させ段階的に移行しています。

段階移行のイメージ

上記のような段階移行するための共存環境を作るにあたっては、以下のような技術的課題をクリアする必要があります。

  • 同一リポジトリで異なるバージョンの FW/ 言語の共存(ペライチでは CakePHP2+PHP 5 系と CakePHP4+PHP7 系の共存)
  • 同一ドメインにおいて、機能単位(Controller)でリクエストの振り分け(CakePHP 2 or CakePHP 4)
  • CakePHP2/CakePHP4 間でのセッションの共有

この中で今回は、太字部分の同一リポジトリで異なるバージョンの FW/ 言語の共存について紹介します。

CakePHP2/CakePHP4 で共存環境

CakePHP2 と CakePHP4 を同一リポジトリ、同一サーバで共存させる方法を紹介します。
なお、本稿では共存のための基本的な部分の設定を紹介しており、実際にはそれぞれの環境や構成によって細々追加設定など必要ですのでご留意ください。
また、紹介する Cake の定義ファイルのデフォルト設定につきましてはバージョンアップ当時のものであり、現時点で変更されている可能性もありますので合わせてご留意ください。

環境インストール

以下の通り構成します。

  • Amazon Linux 2
  • nginx
  • CakePHP 2/PHP 5.6
  • CakePHP 4/PHP 7.4

上記は1サーバにおける環境です。
(nginx につきましてはシリーズ第一弾のセッション振り分け編で登場します。今回は関係ありませんのでご留意ください)

異なるバージョンの PHP をそれぞれのコマンドで使い分けるため、以下のようにインストール、初期設定します(このあたりの方法はネット上にたくさん転がっているため詳細は割愛します)。
PHP5 を使用する php コマンド:php or php56
PHP7 を使用する php コマンド:php74

php-fpm サービスはそれぞれ以下の通り
php56-php-fpm.service
php74-php-fpm.service

ディレクトリ構成

以下の通り同一リポジトリ内で Cake2 と Cake4 を共存させます。
既存の Cake2 のリポジトリ内に peraichi_v4 というディレクトリを作成し、その配下に Cake4 環境を作成しています。

ディレクトリ構成

なお、フロントエンド(webroot 配下のファイル)はバージョンアップの影響を受けません。そのため CakePHP2/PHP5.6 側を使用するものとします(すべての移行が終わった後に Cake4 側へ移動させる)。

Cake4 と PHP7 の紐付け

Cake のデフォルト設定ですと、 Cake2/Cake4 ともに PHP5 を使用してしまいます。これは「php」コマンドが php56 を向いており、 php7 を使用するには「php74」と打たないといけないためです。
そのため Cake4 では php74 を呼び出せるように「peraichi_v4\bin\cake」ファイルを修正します。

peraichi_v4\bin\cake(デフォルト)
・・・省略・・・
# If your CLI PHP is somewhere that this doesn't find, you can define a PHP environment
# variable with the correct path in it.
if [ -z "$PHP" ]
then
    PHP=$(findCliPhp)   // こちらに記載していないが、findCliPhp()メソッドで使用するphpを探して指定
fi
・・・省略・・・

上記を以下のように修正します。

peraichi_v4\bin\cake(修正後)
・・・省略・・・
# If your CLI PHP is somewhere that this doesn't find, you can define a PHP environment
# variable with the correct path in it.
if [ -z "$PHP" ]
then
    PHP=php74   // php74を直接指定
fi
・・・省略・・・

ちなみに Cake2 の場合は以下が該当します。
app\Console\cake

webroot (フロントエンド)のパス指定をCake2側に設定する

webroot 配下のファイルはバージョンアップには関係ないため、 Cake2 側にそのまま配置し、すべての移行が終わったタイミングで移動させます(同じものをコピーしてもよいですが二重管理になるため)。
デフォルトだと Cake2/Cake4 それぞれの webroot パスを指定しているため、 Cake4 側の webroot パス指定を Cake2 側に変更します。
「peraichi_v4\config\app.php」ファイルを修正します。なおドキュメントルートは「/var/www/hoge」とします。

peraichi_v4\config\app.php(デフォルト)
・・・省略・・・
    'App' => [
        'namespace' => 'App',
        'encoding' => env('APP_ENCODING', 'UTF-8'),
        'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'),
        'defaultTimezone' => env('APP_DEFAULT_TIMEZONE', 'UTC'),
        'base' => false,
        'dir' => 'src',
        'webroot' => 'webroot',
        'wwwRoot' => WWW_ROOT,
        //'baseUrl' => env('SCRIPT_NAME'),
        'fullBaseUrl' => false,
        'imageBaseUrl' => 'img/',
        'cssBaseUrl' => 'css/',
        'jsBaseUrl' => 'js/',
        'paths' => [
            'plugins' => [ROOT . DS . 'plugins' . DS],
            'templates' => [ROOT . DS . 'templates' . DS],
            'locales' => [RESOURCES . 'locales' . DS],
        ],
    ],
・・・省略・・・

上記に対し、以下のように'webroot_path'指定を追加します。

peraichi_v4\config\app.php(修正後)
・・・省略・・・
    'App' => [
        'namespace' => 'App',
        'encoding' => env('APP_ENCODING', 'UTF-8'),
        'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'),
        'defaultTimezone' => env('APP_DEFAULT_TIMEZONE', 'UTC'),
        'base' => false,
        'dir' => 'src',
        'webroot' => 'webroot',
        'wwwRoot' => WWW_ROOT,
        //'baseUrl' => env('SCRIPT_NAME'),
        'fullBaseUrl' => false,
        'imageBaseUrl' => 'img/',
        'cssBaseUrl' => 'css/',
        'jsBaseUrl' => 'js/',
        'paths' => [
            'plugins' => [ROOT . DS . 'plugins' . DS],
            'templates' => [ROOT . DS . 'templates' . DS],
            'locales' => [RESOURCES . 'locales' . DS],
        ],
        'webroot_path' => '/var/www/hoge/app/webroot', // webrootをCake2側に指定
    ],
・・・省略・・・

まとめ

いかがだったでしょうか。上記により、複数バージョンの CakePHP を同一リポジトリに共存させることができます。
注意点として、すべてのソースを移行後は Cake2 を削除して Cake4 だけの環境にします。 このとき、 Cake2 のディレクトリを削除して Cake4 の"peraichi_v4"だけ削除する場合、 Cake4 側の各種パス指定も忘れないように修正してください(消すだけじゃダメという意味)。

今回の記事が CakePHP に限らずフレームや言語のバージョンアップにおける移行方式の参考になりますと幸いです。
以上です。読んでいただきありがとうございました。

採用情報

現在エンジニア募集しています!

▼ 採用ページ
https://recruit.peraichi.co.jp/

▼ 選考をご希望の方はこちら(募集職種一覧)
https://hrmos.co/pages/peraichi/jobs?category=1629135637016141824&utm_source=techblog&utm_medium=referral&utm_campaign=article-01gdg3a12nm6bz3wzbfnsyxpf2

▼ まずはカジュアル面談をご希望の方はこちら
https://hrmos.co/pages/peraichi/jobs/0000029?utm_source=techblog&utm_medium=referral&utm_campaign=article-01gdg3a12nm6bz3wzbfnsyxpf2

募集中の職種についてご興味がある方は、お気軽にお申し込みください(CTO がお会いします)

ペライチ

Discussion