PHPのパフォーマンス調査　PHP5とPHP7の処理速度

## 背景
PHP5からPHP7へアップデートするだけで処理速度が大幅にアップするという話を聞いたので検証してみることにした。

※ ごめんなさい。
　最もらしい建前を立ててみたけど、嘘です。
　実際はQiitaへの投稿に慣れるための記事なので、
　１つの例として参考にしてもらえる程度だと嬉しいな。

## この記事の対象者
- Dockerfileのシンプルなサンプルをみたい人
- Dockerのamazonlinux2コンテナ内でPHPをインストールしたい人

## この記事で記載していない内容
- LaravelやCakePHP等、フレームワークのセットアップ方法
- NginxやApache等、ウェブサーバー用ミドルウェアのセットアップ方法


上記の内容が知りたい方は他の記事を参考にされた方が良いと思いますので、そっとページを閉じていただけると幸いです。

## 検証環境
Machine： Mac mini (2018)
OS： macOS Catalina バージョン 10.15.7
仮想環境： Docker AmazonLinux2イメージ
PHP5: PHP 5.6.40
PHP7: PHP 7.3.24

# Dockerfileの内容
  PHP5もPHP7もログインしてからPHPをインストールするので、同じDockerfileを使用しています

```Docker:Dockerfile
# AmazonLiunx2のイメージを使うよ
FROM amazonlinux:2

# ここではユーザー'bearrabi'で管理者用コマンドを使えるようにしてるだけだよ。
# PHPインストールのコマンドはここには書いてないよ
RUN yum -y update && \
  yum clean all && \
  yum install -y sudo && \
  yum install -y vim && \
  yum install -y systemd && \
  yum install -y yum-utils && \
  useradd bearrabi && \
  echo "bearrabi ALL=NOPASSWD: ALL" >> /etc/sudoers

# コンテナログイン時のカレントディレクトリを指定
WORKDIR /usr/local/sbin
```

# Docker イメージのビルドからログインまで
```Bash:terminal
# ディレクトリを紐づけるために、ローカルにディレクトリを作成
# 途中のディレクトリが存在しないとエラーになるから注意ね
% mkdir /Users/bearrabi/php_56/work

# 自分の指定した名前で、Dockerfileの内容をイメージ化
% docker build . -t php_dif_img

# イメージからコンテナを生成してログイン可能状態にする
% docker run -d --name php_dif_con --privileged -v /Users/bearrabi/php_56/work:/usr/local/sbin:rw php_56_img /sbin/init

# 生成したコンテナにログイン
% docker exec -it -u bearrabi php_dif_con /bin/bash
```

[【ユーザー】@【コンテナID】 sbin]$　となっていればログインに成功してます。
自分の環境では以下になりました。

```Bash:terminal
[bearrabi@82461436bd6c sbin]$ 
```


## PHP5.6をインストール


```Bash:terminal
### epel(Extra Packages for Enterprise Linux)リポジトリをインストール
# レポジトリは「貯蔵庫」の意味で、epelはOSに存在していないものを保管します
# remiレポジトリをインストールするのに必要です
$ sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

### remiレポジトリをインストール
# remiレポジトリにはPHPが保管されています
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

### 各リポジトリのアップデート
$ sudo yum -y update --disablerepo=amzn2-core --enablerepo=epel,remi,remi-php56

### PHP5.6をインストール
$ sudo yum -y install --enablerepo=remi,remi-php56 php56 
```

## PHPのVersion確認

```Bash:terminal
$ php56 -v
PHP 5.6.40 (cli) (built: Sep 29 2020 11:42:56) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
```
PHP 5.6.40がインストールされました。

## 処理速度検証(PHP 5.6.40)

### ソースコード
```PHP:test.php
<?php

  // 速度計測の開始時刻をミリ秒で取得
  $start_time = microtime(true);

  // この変数をループ回数の上限とする
  $max_loop_index = 100000000;

  // ループで上限値まで繰り返し
  $counter = 0;
  for($i=0; $i<$max_loop_index; $i++){ $counter += 1; }

  // 速度計測の終了時刻をミリ秒で取得
  $end_time = microtime(true);

  // 処理開始から終了まで何ミリ秒必要だったかを取得
  $time_defference = $end_time - $start_time;

  // 計測時間を出力
  print "time: ".$time_defference."秒\n";

  // ループ処理が最後まで完了しているか確認
  print "counter: $counter 回ループ処理を行いました\n";
?>

```

### スクリプトの実行と計測結果
```Bash:terminal
$ php56 test.php 
time: 8.2781031131744秒
counter: 100000000 回ループ処理を行いました
```
何度やっても大体8.2秒でした。

## PHP5.6をPHP7.3へアップデート
```Bash:terminal
# インストール済みのPHPを削除
$ sudo yum -y remove php*

# インストール済みのepelレポジトリを削除
$ sudo yum -y remove epel*

# 新しいepelレポジトリをインストール
$ sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-12.noarch.rpm

# 新しいremiレポジトリをインストール
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

# レポジトリのアップデート
$ sudo yum -y update --disablerepo=amzn2-core --enablerepo=epel,remi,remi-php73

# php7.3をインストール
$ sudo yum -y install --disablerepo=amzn2-core --enablerepo=remi,remi-php73 php
```

##PHPのバージョン確認
```Bash:terminal
$ php -v
PHP 7.3.24 (cli) (built: Oct 27 2020 11:01:59) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.24, Copyright (c) 1998-2018 Zend Technologies
```
PHP 7.3.24がインストールされました

## 処理速度検証（PHP 7.3.24）

```Bash:terminal
$ php test.php 
time: 0.89267206192017秒
counter: 100000000 回ループ処理を行いました
```

あれ？
全く差がないどころか、__PHP7.3の方が少し遅いじゃないか！！__


## 考察
恐らく、単純にインタプリタの処理が早くなった訳ではないのでしょう。
他の記事では、ライブラリを利用した計算時の処理速度とメモリの使用状況をモニタリングしていました。

※参照
[PHPのパフォーマンス比較（5.3〜7.0）](https://qiita.com/segawa/items/7368af9797c1b76dcd9c)

この記事では明らかにPHPのバージョンアップによって処理速度が早くなっています。
なので、一概に嘘ではないかと。


## 最後に
今回はPHPのバージョンによる速度の処理速度の検証を行いました。
結果的には、単純な処理をさせても処理速度に差は発生しないという結果です。
パフォーマンス改善を提案する時の簡単なエビデンスとしたかったのですが、残念😅

とはいえ、Dockerの簡単な使い方や、amazon-extra-installを利用しないPHPのインストール方法など、最小限に記載することはできたかと思います。
どなたかのお役に立てれば幸いですね。

以上です。
最後まで読んでいただき、ありがとうございます☺️