コネヒト開発者ブログ

コネヒト開発者ブログ

PHP8.1アップデートまでの道のり

こんにちは。コネヒトでバックエンドエンジニアをしております@homiTakahashiです。

今回は私たちの使用している言語PHPの8.1バージョンまでアップデートについて話していけたらと思います。

前提として私たちのアップデートしたいプロジェクトは以下のような環境です。

  • PHP7.4
  • フレームワークはCakePHP4.2
  • dockerを使用
  • BaseImageはalpine

そこでPHP8.1にする上でCakePHP4.2→4.3にバージョンを上げないといけないことが分かり段階を踏むように以下のように進めました。

作業手順

1. DockerImageを変更する

PHPのバージョンを指定し、dockerでコンテナが安定して起動するようにエラー文を読みながら対応していきます。alpineのバージョンは古いとPHP8.1に対応していないのでバージョンを上げる必要がありました。

FROM alpine:3.16
︙
RUN apk add --update-cache --no-cache \
    php81 \
    php81-dev~=8.1 \
︙

主に以下のようなミドルウェアのアップデートが必要になってくると思われます。

redis-3.1.1 \ → redis-5.3.6 \

2. テストコードからエラーや非推奨を対応していく

弊社はテストコードを導入していたため、CIなどで一旦全てのテストを回し一つずつエラーや非推奨を潰していきました。

例1)

PHPUnit\Framework\Exception: This test uses TestCase::prophesize(), but phpspec/prophecy is not installed. Please run "composer require --dev phpspec/prophecy".

prophesize はPHPUnit 10 でビルトインではなくなるため、ライブラリに phpspec/prophecy-phpunit を追加し、利用箇所で明示的にTraitを呼び出すように修正しました

composer require --dev phpspec/prophecy

※PHP8.1の非推奨はこちら

例2)

Deprecated Error: Return type of Frlnc\Slack\Http\SlackResponse::jsonSerialize() should either be compatible with JsonSerializable::jsonSerialize(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice

外部ライブラリのfrlnc/php-slack を利用してSlack連携を行っていたのですが、frlnc/php-slack ではPHP8.1対応が行われていなかったので、ForkされているレポジトリをGitHub上で検索し、対応しているレポジトリを利用するように composer.json の記述を変更しました。

"repositories": [
      {
        "name":"frlnc/php-slack",
        "type":"vcs",
        "url": "https://github.com/deqngeorgiev/php-slack"
      }
    ],
"require": {
        "frlnc/php-slack": "dev-master",
}

3. 外部サービス周りの動作確認をする

テストコードでは拾いきれないSentryやPapertrailなどの外部サービスは手動で動作確認をしました。

4. リリースをする

リリースをしていく上で、弊社では影響範囲を少なくするようにカナリアリリースを使用しました。カナリアリリースとは、全ユーザーにいきなりリリースするのではなく1%~30%くらいまで様子を見ながら徐々にリリースしていく方法です。

このような手順をPHP8.0、CakePHP4.3、PHP8.1と3度繰り返しアップデート作業を行いました。

感想

大変だったこととしてはバージョンのアップデートをしてテストを回した際、かなりの量の非推奨エラーが出ていたことです。 それらを一つ一つ調査→修正→レビューを繰り返し行うとかなりの作業量になります。私たちチームは以下のように工夫することによって結果としてスムーズに取り組めたのかなと思っております。

  • いきなりバージョンを8.1にするのではなくスコープを分けて小さく行う
  • 非推奨対応はチームで分担して取り掛かる

またテストコードがあることで対応箇所が可視化できるので、テストコードの重要性も改めて気付きました。

次のステップとしてはPHP8.1の新機能を取り入れ、PHP8.2にアップデートしていきたいと思っております!!

関連記事

tech.connehito.com

tech.connehito.com

コネヒトでは一緒に働く仲間を募集しています! そして興味持っていただけた方は気軽にご連絡ください! https://www.wantedly.com/companies/connehito/projects