XAMPP（PHP）のアップデートと躓きポイント

## そろそろPHPとMariaDBをアップデートしたい

XAMPPで何年か開発を行っていると、PHPやMariaDB（MySQL）がだいぶアップグレードしていて、新しいバージョンに対応したくなることがしばしばある。
これが結構面倒なので手順をまとめてみた。

### 対象ユーザー

- XAMPPでバーチャルホストを設定して複数のサイトを開発している
- PHPのバージョンアップで動かなかったときに古いPHPを利用できるようにしておきたい。
    - 特に7.x → 8.xはdeplicatedな機能が多いので注意が必要
- え？vagrant？なにそれおいしいの？

## 手順

### 1. [古いXAMPP] DBのバックアップ（dump）

XAMPPなら http://localhost/phpmyadmin からバックアップできる。
`xampp\mysql\bin\mysqldump.exe` で一括バックアップをしても良いが、この際不要なDBは切り捨てよう

### 2. [古いXAMPP] XAMPPの停止

XAMPPで実行しているサービス（PHPやMariaDB等）を停止し、「Quit」でXAMPP自体も終了する。

### 3. [古いXAMPP] XAMPPフォルダのリネーム

例： `D:\xampp` →　`D:\xampp_適当な文字列（日付とかバージョンとか）`
リネームができないときは「2. [古いXAMPP] XAMPPの停止」に失敗しているので確認する。

### 4. XAMPPのダウンロード

ここからインストールしたいXAMPPを選択する
自分はDドライブに入れるようにしているのでportable版を愛用している。
（portable版は「[その他のダウンロード → XAMPP → Windows](https://sourceforge.net/projects/xampp/files/XAMPP%20Windows/)」から取得できる）

https://www.apachefriends.org/jp/download.html

### 5. XAMPPのインストール

もともとあったXAMPPのパスに展開し、インストールする

### 6. XAMPP（PHP, MariaDB）の起動

一旦XAMPPが正常動作するか確認する。
http://localhost にアクセスしてphpのバージョン等を確認

### 7. データベースのリストア

http://localhost/phpmyadmin へアクセスし、データベースを復元する。
root以外のユーザーがいたり、rootのパスワードを設定していたりする場合はユーザーデータも編集しておく。

※Apacheの設定でミスるとしばらくApacheが使えないので先にやっておくほうがよい

#### rootのパスワードを書き換えたらphpMyAdminにアクセスできなくなった

`xampp\phpMyAdmin\config.inc.php` の `$cfg['Servers'][$i]['password']` に設定したパスワードを入れる。

### 8. 旧データのコピー

`旧XAMPP\htdocs` 内の自作データを新XAMPPのhtdocsへコピーする。
**新XAMPPと重複するファイルは上書きしない方がよい**
人によってはかなりの時間がかかるのでその間に先の手順を進める。

### 9. PHPの設定の引継ぎ（php.iniを書き換えている人）

新旧の `xampp\php\php.ini` を見比べて差分を吸収する。
よく書き換えられているのは以下

- timezone（Asia/Tokyoへの変更）
- memory_limit
- post_max_size
- upload_max_filesize
- max_execution_time
- extentionの利用可否

### 10. Apacheの設定の引継ぎ（httpd.conf等を書き換えている人）

- `xampp\apache\conf\httpd.conf`
- `xampp\apache\conf\extra\*.conf`

を新旧見比べて必要な差分を吸収する。
よく書き換えら得れているのは以下

- `xampp\apache\conf\httpd.conf`
    - LoadModuleの利用可否
- `xampp\apache\conf\extra\*.conf`
    - `xampp\apache\conf\extra\ssl.conf`
    - `xampp\apache\conf\extra\vhosts.conf`
    - `xampp\apache\conf\extra\xampp.conf`

### 11. XAMPPを起動してテスト

ここまで終わったら再度XAMPPを起動し、Apacheが正常に起動するかどうかを確認。
大抵の場合ここで躓くので9,10をよく確認する
特にバーチャルホストの設定でエラーになるケースが多い。
（特定のサイトデータ（htdocs内）を引き継がず、バーチャルホストの設定だけ引き継いでしまった、とか）
その場合、バーチャルホストを設定をまっさらにして、起動・停止を繰り返しながら1サイトずつ追記していくと（原因がわかりやすくて）良い。


### 12. composerの再インストール

インストーラーからインストールしたものであれば「アプリと機能」に存在するのアンインストールし、本家から新たにダウンロードしてインストールする。

https://getcomposer.org/


----

## トラブルシューティング

### phpのバージョンが古いまま

**環境変数のPATHの設定が旧XAMPPのPHPになっている**

「3. [古いXAMPP] XAMPPフォルダのリネーム」を行ったときに環境変数が変わってしまっている事があるため、
システム → システムの詳細設定 → 環境変数
へアクセスし、ユーザー環境変数およびシステム環境変数を確認する。


### composerをインストール後、実行すると「'php' は、内部コマンドまたは外部コマンド～」と言われる

以下の記事と同じ原因。
環境変数の`PATHEXT`に`;.exe`を追記する

https://qiita.com/bananacoffee/items/0352591a1a7e1a1cb71e

### PHPのアップグレードによりサイトでエラーが出てしまう（deplicatedとか）

**アップグレードに対応した修正を行うのが最適**だが、XAMPP内で旧バージョンのPHPを並列実行するのがおすすめ。
旧XAMPPのphpフォルダを`phpバージョンNo（例：php74）`とリネームし 新XAMPP内にコピーし、あとは下記の記事に従って設定するとCGI版で複数のPHPを並列実行することができる。

https://qiita.com/bananacoffee/items/84c1938e311adb2621a2

なお、バージョンの違うPHP環境化でComposerを利用する場合は設定が必要

https://www.sodo-shed.com/archives/12017

http://www.y2sunlight.com/ground/doku.php?id=composer:1.9:phpswitch

### composer installでエラー

PHPのバージョンに対応していない可能性がある。
よく見かけるのは[Facebook SDK for PHP(facebook/graph-sdk)](https://github.com/facebookarchive/php-graph-sdk)がPHP8.0に対応していないというもの。
Facebookログインを利用している人は注意すべし。
**なお、修正版として公開されている[joelbutcher/facebook-graph-sdk](https://github.com/joelbutcher/facebook-php-graph-sdk)もPHP8.1には対応していない**ので、上記「PHPのアップグレードによりサイトでエラーが出てしまう（deplicatedとか）」でPHPのバージョンを下げるか、最悪自前で作り直す必要がある
(めちゃくちゃハマった)

### 並列実行のPHPを利用すると「Warning: PHP Startup: fileinfo: Unable to initialize module」と表示される

`php.ini` 内のパス指定が間違っているので修正する。
または大文字小文字を見分けている際にPEARのパスがデフォルトで大文字で指定されているので小文字に変える

### 並列実行のPHPをコマンドラインから実行する

ビルトインサーバーなどを実行する場合

`path_to_php\php.exe -S` などと、パス指定を行う必要がある
うまいことパスの設定をゴニョゴニョすれば `php80 -S` とかでも通せるかもしれない。