【PHP】1つのxamppでPHPのバージョンを切り替えて使用する（PHP8 ⇄ 7）

# はじめに
今回、既存のXAMPP環境（PHP8）でPHP7を使えるようにするために、調査したことをまとめました。
`既存のxamppに別のバージョンのPHPをインストールし、PHPのバージョンを切り替えてApacheを起動する` イメージです。

Apacheエラーや、Composerエラーなど詰まりに詰まって、環境構築に約3日程かかりました・・。
この記事が、同じエラーが発生した方の助けになれば嬉しいです。

また色々調べている中で、 `シンボリックリンクを使用し、1つのxammでPHPのバージョンを切り替える` という方法もあったのですが、今回ご紹介する方法が最もシンプルなのではないかと思います。

※おことわり※
基本的に学習内容のアウトプットです。
初学者であるため、間違い等あればご指摘いただけますと嬉しいです。

# この記事の目的
以下内容のアウトプット
- PHPのインストール
- ComposerでPHPのバージョンを指定
- Composerのバージョン変更

# 既存の開発環境
- xampp 8.1.10
- PHP 8.1.10
- Composer 2.3.0

**Tips：**
- xamppのバージョン = PHPのバージョン
- バージョンの確認は以下コマンドを参考にしてください。

```php
// phpのバージョンを確認
php -v

// Composerのバージョンを確認
Composer -v

// xamppのバージョンを確認
xampp -v

// Laravelのバージョンを確認
php artisan -v
```


# この記事の内容
1. PHPインストール
2. ComposerでPHPのバージョンを指定
3. Composerのバージョン変更
4. Apacheエラーについて

# 1. PHPインストール
:::note
今回、PHP7.1.30をインストールします。
:::

### 【１】 xampp7.1.30をダウンロード

- ダウンロード先

https://sourceforge.net/projects/xampp/files/XAMPP%20Windows/

- ダウンロードするファイル
`xampp-windows-x64-7.1.30-5-VC14.zip`

**Tips：**
ダウンロードしたzipファイルは、すべて展開してください。

### 【２】 既存のxamppフォルダー内のファイル名を変更
以下3点の、ファイル名を変更する
- xapmm/php → `php8110`
- xampp/apache/conf/http.conf　→　`http.conf8110`
- xampp/apache/conf/extra/httpd-xampp.conf → `httpd-xampp.conf8110`

**Tips:**
ファイル名は任意ですが、バージョンが分からなくならないよう `ファイル名 + バージョン` にしておくと良いと思います。

### 【３】 既存のxamppフォルダー内に、ファイルを配置
先ほどダウンロードしたxamppのうち、ファイル名を変更した３点と同名のものを、既存のxamppフォルダーに配置する

### 【４】 http.confを編集
- php7apache2_4.dll へのパスを、ファイルの最終行に追記する

```PHP:http.conf
LoadModule php7_module c:/xampp/php/php7apache2_4.dll
```

- 拡張子(.php)とPHPを関連付けるコードを、ファイルの最終行に追記する
    - `FilesMatch` ディレクティブを使用
 
```PHP:http.conf
<FilesMatch "\.php$">
  AddHandler php7-script .php
  AddType application/x-httpd-php .php
</FilesMatch>
```

- php.iniへのパスを、ファイルの最終行に追記する
    - `PHPIniDir` を使用

```PHP:http.conf
PHPIniDir "c:/xampp/php"
```

**Tips：**
○○へのパスは、ご自身の環境に合わせてください。

**参考：**

https://www.javadrive.jp/apache/php/index1.html

### 【５】 httpd-xampp.conffを編集
`php7_module` → `php_module` に変更する（3か所）

```PHP:httpd-xampp.conff
# <IfModule php7_module>   ←コメントアウトにする

<IfModule php_module>      ←追記
```
**参考：**

https://www.php.net/manual/ja/migration80.other-changes.php

### 【６】 php.iniを編集
以下1行、コメントアウトを外す

```PHP:php.ini
; extension_dir = "./"    ←変更前
extension_dir = "./"      ←変更後
```

### 【７】 PHPのバージョンを確認
以下コマンド実行し、phpのバージョンが確認できたら成功

```PHP
php -v

// 以下のように出力されたらOK
PHP 7.1.30 (cli) (built: May 28 2019 15:32:26) ( ZTS MSVC14 (Visual C++ 2015) x64 )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
```

# 2. ComposerでPHPのバージョンを指定
### 【１】 ComposerでPHPのバージョンを指定
以下コマンドを実行する

```php
// プロジェクトのディレクトリに移動
C:\Users\hoge-huga> cd C:\xampp\htdocs\プロジェクト名

// ComposerでPHPのバージョンを指定
C:\xampp\htdocs\プロジェクト名> composer config platform.php 7.1.30

// アップグレード or ダウングレードを適用
C:\xampp\htdocs\プロジェクト名> composer update
```

**参考：**

https://gray-code.com/php/specify-php-version-in-composer/

### 【２】 Apacheを起動
- `.env` ファイルを配置し、プロジェクトディレクトリで以下コマンドを実行

```php
Composer install
```

- Apacheを起動し、ブラウザが開いたら成功
<br/>

:::note warn
以下のようなエラーメッセージが出た場合、Composerのバージョン変更が必要ですので、
[3. Composerのバージョン変更]() を行なってください。

```php
// エラーメッセージ
Composer 2.3.0 dropped support for PHP <7.2.5 and you are running 7.0.0,
please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.
```

Apacheが正常に起動した場合、[3. Composerのバージョン変更]() は不要です。
:::

# 3. Composerのバージョン変更

:::note
今回、Composer2.2をインストールします。
:::

### 【１】 xamppのPHPバージョンを戻す
以下３点のファイル名を一旦元に戻す
- xapmm/php8110 → `php`
- xampp/apache/conf/http.conf8110　→　`http.conf`
- xampp/apache/conf/extra/httpd-xampp.conf8110 → `httpd-xampp.conf`

**Tips：**
配置済みのPHP7.1.30用のファイルは、名前を `ファイル名 + バージョン` に変更しておくと良いです。

### 【２】 self-updateコマンドを実行

Composerのバージョン指定し、self-updateコマンドを実行する

```php
composer self-update --2.2
```

**参考：**

https://zakkuri.life/laravel-composer-error/

### 【３】 PHP7を適用
先ほどPHP8に戻しましたが、再度ファイル名を変更し、PHP7を適用する
 
**Tips：**
PHPを元のバージョンに戻してからじゃないと、self-updateコマンドが実行できません。

:::note
ここまで終わりましたら、再度[2. ComposerでPHPのバージョンを指定]() を行います。
:::

# 4. Apacheエラーについて
Apacheを起動する際、こんなエラーに遭遇しました。

### XAMPPコントロールパネルでApacheを起動
色々試しても、ずっと同じエラー文が出ており、原因が突き止められませんでした・・。

```php
// エラーメッセージ
Error: Apache shutdown unexpectedly.
This may be due to a blocked port, missing dependencies, 
improper privileges, a crash, or a shutdown by another method.
Press the Logs button to view error logs and check
the Windows Event Viewer for more clues
If you need more help, copy and post this
entire log window on the forums
```
そんな時は、以下を試してください。

### powerShellでApacheを起動
powerShellを管理者で実行し、Apache起動すると、エラー文を確認することができます。
なぜか一部エラー文がドイツ語・・。

```php
// xamppに移動
> cd C:\xampp

// Apache起動
> .\apache_start.bat
```

```php
// エラーメッセージ
Diese Eingabeforderung nicht waehrend des Running beenden
Bitte erst bei einem gewollten Shutdown schliessen
Please close this command only for Shutdown
Apache 2 is starting ...
httpd.exe: Syntax error on line 537 of C:/xampp/apache/conf/httpd.conf: Syntax error on line 20 of C:/xampp/apache/conf/extra/httpd-xampp.conf: Can't locate API module structure `php_module' in file C:/xampp/php/php7apache2_4.dll: No error

Apache konnte nicht gestartet werden
Apache could not be started
```