OpenWork Tech Blog

OpenWork を運営するエンジニアによるテックブログです。

PHP(7.4)・Symfony(4.4)へのバージョンアップ作業注意点

version_up

Webアプリチームの藤原です。少し時間が経ってしまいましたが、昨年に弊社で行ったPHPとSymfonyのバージョンアップ作業で苦労した点をまとめました。

何をバージョンアップしたのか

Before After
PHP 7.2 7.4
Symfony 3.4 4.4

このときSymfony3.4のサポートはまだされていましたが、PHPのバージョンアップと実施するテストに大きな違いは無いため、ついでに実施しています。

PHP・Symfonyバージョンアップ時の基本情報

基本的には公式サイトに記載されている内容さえ押さえておけば問題ありません。

PHP

Symfony

苦労したこと

ここからは弊社で特に苦労・苦戦したことを紹介します。

Symfonyでのjs・cssのアセット管理方法の変更

Before(Symfony3.4) After(Symfony4.4)
symfony/assetic-bundle symfony/webpack-encore-bundle

表のようにjs・cssなどのアセットを管理するパッケージ「symfony/assetic-bundle」がSymfony4.4からサポートされなくなり、「symfony/webpack-encore-bundle」を使うしかなくなりました。

それぞれの機能の簡単な違いは以下の通りです。

symfony/assetic-bundle

js・cssの加工をPHPのcomposerパッケージに含まれるプログラムなどで行う。

symfony/webpack-encore-bundle

js・cssの加工をWebpackを使って行う。

問題

このような違いがあったことで、

  • 今までTwigに記載していたjs・cssを呼び出す方法が全て使えない
  • 難読化やファイルの結合など、バージョンアップ前後で出力されるファイルの内容が異なるため、jsの動作確認、cssのデザイン確認も別途必要

などの、当初の想定よりも時間が掛かってしまいました。

出力されるjs・cssの差分が無ければそれほど確認することはなかったのですが、全くの別物になってしまったため、手動テストや自動テストの実施・見直しが必要になりました。

オブジェクトのシリアル化問題

弊社では、ログイン状態の管理やフォーム入力値などをセッションに保存して利用しています。

DBに保存する、もしくはDBから取得してきたテーブルのEntityをセッションに保存するのですが、バージョンアップしてから、以下のようなエラーが発生してしまいました。

Serialization of 'ReflectionClass' is not allowed

原因

最初はバージョンアップの何が原因か分からなかったのですが、よくよく読んでみるとPHPで7.4からリフレクションクラスがシリアル化出来なくなっていることが原因でした。

https://www.php.net/manual/ja/migration74.incompatible.php#migration74.incompatible.reflection

対応

今まであまりEntityのシリアル化を意識していなかったことでこの問題にぶつかってしまいました。 今回の対応ではセッションに保存されるEntityにマジックメソッドである__serialize__unserializeを実装しました。

ただし、バージョンアップ時にこの対応を入れてしまうと、バージョンアップ前にセッションに保存されたEntityが復元出来なくなってしまうため、以下のように2段階のリリースしています。

  • 旧バージョン環境で旧セッションを新セッションに置き換えるリリース
  • 新バージョンのリリース

この問題に気づいたのがこのバージョンアップ対応の中盤ぐらいだったため、弊社のエンジニア内でもどのように対応しようかと、少しバタバタしていました。

最後に

今回は注意点を2点だけ挙げていますが、詰まった点やエンジニアリソースが必要になった問題は他にも発生しています。 長年継続されてきているプロダクトのプログラム言語・フレームワーク・インフラなどをバージョンアップ・変更することは大変だと改めて感じました。 今回のことを次のバージョンアップの参考にしたいと思いつつも、参考にできるのは流れだけで、実際の修正・変更はバージョンアップごとに異なるため、多分次も同じぐらい大変なんだろうなぁと思っています。

今年でPHP7.4のサポートも切れるので、また近いうちにバージョンアップタスクを実施することになるはずです。 このような作業に興味がある方はぜひ一緒に働きましょう! vorkers.jp