Laravelフレームワークのバージョンアップを実施する
IT技術
Laravelとは?
本日は、業務で実施しましたLaravelのバージョンアップ対応についての知見を記事にしようと思います。
多くのシステム開発やソフトウェア開発では、エンジニアの開発を支援するフレームワークが多数存在しています。
その中でも、LaravelはPHPのフレームワークの一つで、マイクロソフトの.NETの開発に参加していたテイラー(Taylor Otwell)氏が開発しました。
2011年リリースで、もはや世界的に大きく普及したフレームワークと言っても過言ではないかと思います。
その他PHPのフレームワークとして
- CakePHP
- Symfony
- CodeIgniter
- ZendFramework
- FuelPHP
などがあります。
もともと、Laravelが登場する前、CakePHPがPHPフレームワークのトップシェアでした。
CakePHPは、ケーキを焼くように簡単にPHPが開発できるというコンセプトを持ったフレームワークを目指して名付けられたとも言われています。
また、Symfonyは保守性と安全性に重視し、コーディング規約が厳密で堅牢なイメージです。
Symfonyは以前少しだけ触れたことがありますが、Modelに相当するEntityに加え、Repository層が必要になります。
Laravelのフレームワークに関して、実は裏でSymfonyが動いていたりするため、Symfonyを理解していると使いやすいかもしれません。
Laravelのメリット・デメリット
メリット
- コードが分かりやすく、学習コストが低い
- プログラムの拡張性と自由度が高い
- 機能が豊富
- データベース操作が容易
特に感じるのは、プログラムの自由度です。
Laravelでも、SymfonyのようにService層やRepository層を利用するようなレイヤードアーキテクチャ(DI利用)で開発することはできるものの、公式ドキュメントしてそのような利用方法が載っておりません。
正直、使わなくても開発ができちゃうため、そう言った意味で自由性の高いフレームワークであることがわかるかと思います。
デメリット
- コードが複雑化しやすい
- 機能豊富ゆえ、処理速度がそこまで速くない
Laravelのドキュメントを見るとわかりますが、機能が豊富です。
(簡易的なサイトを作るとなると過剰な機能になりやすいかもしれません)
今回のアップデート概要
現在のバージョンが5.6で、とうの昔にサポートが切れています...
目標はもちろん最新バージョンの9.xですが、まずは7.xまで上げることを目標に取り組みました。
アップデートの手順
フレームワークのアップデートガイドを参考に、該当箇所の修正
Laravelに限らず、各バージョンごとにアップデートガイドを用意しています。
そのアップデートガイドを確認し、ソースに影響ある変更点をピックアップし、調査を進めます。
https://readouble.com/laravel/5.7/ja/upgrade.html
https://readouble.com/laravel/5.8/ja/upgrade.html
https://readouble.com/laravel/6.x/ja/upgrade.html
https://readouble.com/laravel/7.x/ja/upgrade.html
もちろんですが、1バージョンずつ順を追って上げていくのが良いです。飛ばしてアップデートすると、影響ある変更点を見逃してしまう可能性があります。
基本は上記手順に則って修正を進めることで問題なくアップデートすることができます。
また、LaravelのGithubではBranchがバージョンごとに切られているため、バージョン間のCompareで差分を確認することも可能です。
言語のアップデートガイドを確認
フレームワークのバージョンで言語のバージョンの要件も変わっています。
今回Laravelのバージョンアップに影響し、言語側のPHPもアップデートが必要となりました。
PHPにもアップデートガイドがありますのでフレームワーク同様、ソースに影響ある変更点をピックアップし、調査を進めます。
https://www.php.net/manual/ja/migration73.php
インストール済ライブラリ関係のアップデート有無を確認
composerでインストール済みのライブラリ関係がLaravelのバージョンアップで影響を受けないかを確認していきます。
- アップデート後、該当ライブラリが正常に動くかの確認
- ライブラリのGithubのReleasesを確認し、サポートされているかを確認
PHPのバージョンの兼ね合いもありますので、必要に応じて対応するようにアップデートしましょう。
アップデート後、どういった内容が変更になっているかをGithubのReleasesを見て確認しておきましょう。
インフラ側のサポートを確認、アップデート手順の確認
実際にサービスが動いているインフラ側のアップデートが必要かを確認します。
本業務で取り扱っているのが、GoogleCloudPlatformのAppEngineを利用しています。
AppEngineは、ランタイムの切り替えで簡単にPHPのバージョンアップが可能であることがわかります。
https://cloud.google.com/appengine/docs/standard/php7/runtime?hl=ja#php-7.3
また、定時バッチ実行をGoogleCloudPlatformのComputeEngine(仮想マシン)利用しているため、Linux Debian環境のPHPアップデートが必要となります。
また、Composerも1から2にアップデートする対応を取りました。
実際に仮想マシン環境のアップデートを実施した手順は下記となります。
- apt-getコマンドの有効化
- PHP7.3のインストールと切り替え
- Composer2のインストールと切り替え
apt-getコマンドの有効化
apt-getは、パッケージ(ソフト)のインストールやアンインストールを簡単にするためのツールです。
実際に利用していたComputeEngineではapt-getコマンドが使える環境ではなかったので、apt-getを有効化させました。
実際のエラーは異なっていたかもしれませんが、リポジトリの情報が変更された影響でアップデートできなくなっていました。
1$ sudo apt-get update
2Get:1 http://archive.raspberrypi.org/debian buster InRelease [32.6 kB]
3Get:2 http://raspbian.raspberrypi.org/raspbian buster InRelease [15.0 kB]
4Reading package lists... Done
5E: Repository 'http://archive.raspberrypi.org/debian buster InRelease' changed its 'Suite' value from 'testing' to 'oldstable'
6N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
7E: Repository 'http://raspbian.raspberrypi.org/raspbian buster InRelease' changed its 'Suite' value from 'stable' to 'oldstable'
8N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
下記のコマンドで対応可能です。
1# リリース情報を更新し、適切なリポジトリに変更させる
2# 途中でエラーが起きるかもしれないが、このコマンドでリポジトリ情報を更新する
3$ apt-get update --allow-releaseinfo-change
4
5# 2回目で成功する
6$ apt-get update
PHP7.3のインストールと切り替え
現在インストールされているのは、PHP7.2ですので、7.3をインストールします。
フォールバックのことも考慮する必要があるため、今のバージョンに対し、追加バージョンを入れ、切り替えるように対応します。
packages.sury.org/php のリポジトリ情報を追加し、パッケージ・リストの更新を行います。
その後、使用バージョンの確認し、正常にインストールされているかを確認します。
1$ apt-get update
2
3# php7.3系のインストール
4$ sudo apt-get install -y php7.3 php7.3-cli php7.3-common php7.3-fpm php7.3-mysql php7.3-dev php7.3-mbstring php7.3-zip php7.3-xml php7.3-curl
5
6# php7.3がインストールされたかを確認
7$ update-alternatives --display php
8php - manual mode
9 link best version is /usr/bin/php7.3
10 link currently points to /usr/bin/php7.3
11 link php is /usr/bin/php
12 slave php.1.gz is /usr/share/man/man1/php.1.gz
13/usr/bin/php7.2 - priority 72
14 slave php.1.gz: /usr/share/man/man1/php7.2.1.gz
15/usr/bin/php7.3 - priority 73
16 slave php.1.gz: /usr/share/man/man1/php7.3.1.gz
Composer2のインストールと切り替え
1# 現在のバージョンを確認
2$ composer -V
3
4# Composer2のインストール
5$ sudo composer self-update --2
6
7# 切り替わっているかを確認する
8$ composer -V
Ver.9のLTSが外れた理由とは?
本来、Laravel待望の新バージョン9がLTS(Long Term Support)で発表され、多くの人が期待を膨らませてアップデートを検討していたかと思います...
しかし、下記を確認する限り、LTSではなくなってます...
https://github.com/laravel/docs/blob/9.x/releases.md
あれ、LTSやめた?見間違い???
と思っていたのですが、どうやらLTSが外れてしまったのには理由があるようです。
下記Pull Requestを見ると納得です。
https://github.com/symfony/symfony/pull/45377
簡単にご説明します。
冒頭でもお話ししましたが、Laravelは裏でSymfonyが動いています。そのSymfonyに影響の大きいPRが出ており、PHPの最低バージョンを8.1に引き上げるというものでした。
上記PRは2月25日にマージされており、Symfony6.1からPHP8.1以上の要件が確定しました。
しかしながら現状、Laravel9のPHPサポートは、8.0~8.1となっているので、上記理由からLTSを外したのではないかと言われています。
上記のこともあって、今度リリースされるLaravel10に関してはPHP8.1以上が要件として既に組まれています。
最新のLTSが使えるようになるのはまだまだ先になりそうです...泣
こまめなアップデートを
ついつい後回しにしがちなアップデート対応ですが、対応が遅れれば遅れるほど大変になります...
特に、セキュリティー関わるところですので、何かがあっては遅いです。
また、近々Laravelのバージョン9を目指してアップデート対応をすることになると思います。
Laravel9に上げて安心!という訳ではなく、Release Notesにもあります通り、2024年2月がセキュリティサポート期限です。
エンジニアとして、常にフレームワークや言語のバージョンサポート期限を意識し、影響が大きくなる前にアップデートは進めましょう!
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
「好きを仕事にするエンジニア集団」の(株)ライトコードです! ライトコードは、福岡、東京、大阪、名古屋の4拠点で事業展開するIT企業です。 現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。 いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。 システム開発依頼・お見積もり大歓迎! また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」を積極採用中です! インターンや新卒採用も行っております。 以下よりご応募をお待ちしております! https://rightcode.co.jp/recruit