【PHP】PHPのバージョンを更新するべき理由

# はじめに
<!-- 発端や概要を記載 --> 
プロジェクトを進めるにつれて、PHPのバージョンの更新は確実に必要はあると思っていたのですが、なぜバージョンアップが必要なのかを具体的に把握できていなかったので考えてみました。


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [公式サポート期限](#Chapter1)
1. [パフォーマンス向上](#Chapter2)
1. [新文法に対する対応](#Chapter3)
1. [まとめ](#Chapter4)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 公式サポート期限とセキュリティの脆弱性
### PHPバージョンとサポート期限一覧
|バージョン|初回リリース|最新リリース|最新リリース日|アクティブサポート|セキュリティサポート|
|-------|---------|--------|-----------|----------------|----------------|
|8.0|2020/11/26|8.0.9|2021/07/29|2022/11/26|2023/11/26|
|7.4|2019/11/28|7.4.22|2021/07/29|2021/11/28|2022/11/28|
|<font color="Orange">7.3</font>|2018/12/06|7.3.29|2021/07/01|~~2020/12/06(終了)~~|2021/12/06|
|<font color="Red">7.2</font>|2017/11/30|7.2.34|2020/10/01|~~2019/11/30(終了)~~|~~2020/11/30(終了)~~|
|<font color="Red">7.1</font>|2016/12/01|7.1.33|2019/10/24|~~2018/12/01(終了)~~|~~2019/12/01(終了)~~|
|<font color="Red">7.0</font>|2015/12/03|7.0.33|2018/12/06|~~2017/12/03(終了)~~|~~2018/12/03(終了)~~|
|<font color="Red">5.6</font>|2014/08/28|5.6.40|2019/01/10|~~2017/01/19(終了)~~|~~2018/12/31(終了)~~|

### サポート期限とセキュリティ
サポート期限が終了したバージョンを使用していたとしても、急に動かなくなるということはないです。
しかし、サポートが終了すると、セキュリティサポートがなくなり、修正されていないセキュリティの脆弱性にさらされるようになります。

ちなみに2016年にはPHPのセキュリティ脆弱性はDoS、コード実行、オーバーフロー、メモリ破損、XSS、ディレクトリトラバーサル、バイパス、および情報の取得などにおいて100件以上も報告されておりました。[1](#reference)

### 脆弱性を知る・見つける
PHP に関わる多くの脆弱性については、CVE(Common Vulnerabilities and Exposures) と呼ばれる個々の脆弱性管理するために、固有の識別番号が採番されます。
このCVEを元に脆弱性情報を、 [CVE Details](https://www.cvedetails.com/product/128/PHP-PHP.html) や日本語ですと [JVN (Japan Vulnerability Notes)](https://jvn.jp) で情報を得ることができます。
また、 [FriendsOfPHP/security-advisories] (https://github.com/FriendsOfPHP/security-advisories) というPHPプロジェクトおよびライブラリの脆弱性を監視するライブラリも存在するみたいです。

### 脆弱性の対策
自身のプロジェクトで使っている PHP ライブラリとそのバージョンを把握し脆弱性を監視しつつ、必要であればセキュリティ対応ができるバージョンに切り替えていく。

<a id="#Chapter2"></a>
# パフォーマンス向上
### PHPバージョン別のベンチマーク
以下Laravel8.21.0環境でバージョン7.3, 7.4, 8.0が検証されたデータです。
テスト内容は1つのURLに同時接続ユーザー数15、リクエスト数10,000で、1秒あたりのリクエスト数が多ければ多いほど良い結果となるみたいです。
(実行環境については[参考文献](https://kinsta.com/jp/blog/php-benchmarks/)からご覧ください)

![スクリーンショット 2021-10-27 1.13.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249777/2633d8dd-2006-fb70-ada2-e77891b3ffe1.png)

>Laravel 8.21.0 PHP 7.3 のベンチマーク結果：574.67 req/sec
>Laravel 8.21.0 PHP 7.4 のベンチマーク結果：602.15 req/sec
>Laravel 8.21.0 PHP 8.0のベンチマーク結果：623.78 req/sec🏆

結果はこのようになっており、PHP 7.3よりもPHP 8.0の方が1秒あたり8.54%多いリクエストを実行しています。

### その他パフォーマンス向上機能
PHP7.4で実装された [Preloading](https://www.unitrust.co.jp/8752)、 PHP8.0の [JIT](https://qiita.com/rana_kualu/items/ba312d2789bd228f887a) などといったアプリケーションを高速化させる機能もバージョンアップで追加されることがある。

<a id="#Chapter3"></a>
# 新文法に対する対応
言語がアップデートされることによって新しいコードの書き方が追加されることがあり、それによって更に利便性が向上したり、コードを軽量化することができます。
しかし、新文法を知っているのと知らないのではかなり差があり、大きく分けて以下の３つの問題があります。

- コードレビューができない
- ライブラリの処理を追うことができなくなる
- ネット上の新しい情報が理解できない

<a id="#Chapter4"></a>
# まとめ
古いバージョンのPHPでもアプリケーションが急に動かなくなるということはないですが、

- セキュリティサポートが終了してしまうと脆弱性の対策ができない。
- パフォーマンス改善の機会を失う。
- 新文法の記述を知ることができないです。


<a id="#reference"></a>
# 参考文献
- [PHPのリリース日とサポート期限](https://qiita.com/bezeklik/items/72d1ff8393f66673e2bc)
- [PHP における脆弱性との向き合い方とその対策方法](https://yamory.io/blog/php-vulnerabilities-and-keep-secure/)
- [PHP 5.6、7.0、7.1、7.2、7.3、7.4または8.0のベンチマーク（2021年）](https://kinsta.com/jp/blog/php-benchmarks)
- [PHPのサポートされているバージョンを使用する理由について](https://kinsta.com/jp/blog/php-versions)
- [1. CVE Details(引用)](https://www.cvedetails.com/product/128/PHP-PHP.html)