Ubuntu 20.04にPHPを複数インストールして切り替える方法（PPA・apt）


# はじめに

本書では、Ubuntu 20.04に、PHPの環境をインストールする方法をまとめます。

案件によってPHPのバージョンが違うこともあるため、複数のバージョンをインストールして、alternativesで切り替えられるようにします。

# インストール手順
## リポジトリ追加

```bash
sudo add-apt-repository ppa:ondrej/php 
```

のコマンドを実行します。

```txt
Press [ENTER] to continue or Ctrl-c to cancel adding it.
```

と表示されたら、`Enter`キーを押します。

## apt update

```bash
sudo apt update
```

## PHPをインストール

ここでは、本ページ執筆時点で最新の、8.0をインストールします。

```bash
sudo apt install -y php8.0
```

他に、複数バージョンの切り替えを確認するため、本ページ執筆時点で有効な、7.3、7.4もインストールします。

```bash
sudo apt install -y php7.3
sudo apt install -y php7.4
```


## PHPモジュールをインストール

```bash
sudo apt search php8.0-*
```

を実行すると、

```txt
libapache2-mod-php8.0/focal 8.0.10-1+ubuntu20.04.1+deb.sury.org+1 amd64
  server-side, HTML-embedded scripting language (Apache 2 module)

libphp8.0-embed/focal 8.0.10-1+ubuntu20.04.1+deb.sury.org+1 amd64
  HTML-embedded scripting language (Embedded SAPI library)

php8.0/focal 8.0.10-1+ubuntu20.04.1+deb.sury.org+1 all
  server-side, HTML-embedded scripting language (metapackage)

php8.0-amqp/focal 1.10.2-8+ubuntu20.04.1+deb.sury.org+1 amd64
  AMQP extension for PHP

php8.0-apcu/focal 5.1.20+4.0.11-1+ubuntu20.04.1+deb.sury.org+1 amd64
  APC User Cache for PHP

php8.0-ast/focal 1.0.14-1+ubuntu20.04.1+deb.sury.org+1 amd64
  AST extension for PHP 7
・
・
・
```

のように、インストール可能なモジュールが表示されるので、必要なモジュールをインストールする。

例：MySQLを使う場合

```bash
sudo apt install -y php8.0-mysql
```

# alternativesでバージョン切り替え
## 定義

```bash
sudo update-alternatives --install /usr/bin/php php /usr/bin/php7.3 100
sudo update-alternatives --install /usr/bin/php php /usr/bin/php7.4 110
sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.0 120
```

## 切り替え方法
### Priorityを選択して切り替える方法

```bash
sudo update-alternatives --config php
```

```txt
There are 3 choices for the alternative php (providing /usr/bin/php).

  Selection    Path             Priority   Status
------------------------------------------------------------
  0            /usr/bin/php8.0   120       auto mode
  1            /usr/bin/php7.3   100       manual mode
  2            /usr/bin/php7.4   110       manual mode
* 3            /usr/bin/php8.0   120       manual mode

Press <enter> to keep the current choice[*], or type selection number: 
```

のように表示されるので、`Selection`の番号を入れて`Enter`キーを押すと、そのバージョンが有効になります。
※上記はPHP 8.0が有効になっている状態です。

```bash
php -v
```

```txt
PHP 8.0.10 (cli) (built: Aug 26 2021 15:50:07) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.10, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.10, Copyright (c), by Zend Technologies
```

のように、選択したバージョンになっていればOKです。

### コマンドで直接設定する方法

7.4を有効にする場合：

```bash
sudo update-alternatives --set php /usr/bin/php7.4
```

```bash
php -v
```

```txt
PHP 7.4.23 (cli) (built: Aug 26 2021 15:51:37) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.23, Copyright (c), by Zend Technologies
```

のように、選択したバージョンになっていればOKです。

# WSL2 Ubuntu 20.04でのxdebug用の設定

WSL2 Ubuntu 20.04にPHPを入れ、XDebugを有効にしてデバッグしたので、備忘録のため、その手順をまとめます。

## WSL2 Ubuntu 20.04での設定

※`phpX.X-xdebug`（PHP8.0の場合、`php8.0-xdebug`）をaptでインストールします。

```bash
apt install -y php8.0-xdebug
```

次に、xdebugの設定ファイルを編集します。
php8.0の場合：`/etc/php/8.0/mods-available/xdebug.ini`

まず、

```ini
zend_extension=xdebug.so
```

の設定をコメントアウトします。

```ini
; zend_extension=xdebug.so
```

次に、末尾に下記を追加します。

```ini
zend_extension="/usr/lib/php/20200930/xdebug.so"

xdebug.log=/tmp/xdebug.log
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_port=9003

xdebug.remote_enable = 1
xdebug.remote_connect_back = 1
xdebug.remote_autostart = 1
```

なお、`zend_extension`のパスはバージョンによって異なるので、`xdebug.so`のファイルを検索して、絶対パスを設定します。

## Visual Studio Codeでのデバッグ設定

Visual Studio Code（以下、vscode）は、WSL2 Ubuntuで起動します。

```bash
cd {ソースのディレクトリ}
code ./
```

※初回は、色々とインストールされるので時間がかかりますので、しばらく待ちます。

次に、デバッグの設定 `launch.json` の `configuration`の設定に、下記を追加します。

```json
        {
            "name": "Listen for Xdebug",
            "type": "php",
            "request": "launch",
            // "stopOnEntry": true,        // 最初に制御が来たソースの先頭で必ずブレークする設定。（トレースが正しくできることが確認できたら、消して構わない。）
            "port": 9003
        },
```

なお、初めてデバッグの設定をするときは、`stopOnEntry`をtrueに設定し、デバッグの実行時にブレークすることを確認します。
正しくブレークしてデバッグできることが確認出来たら、`stopOnEntry`の設定をfalse（あるいはコメントアウト）にして大丈夫です。