Check! Azure Web Apps で PHP 拡張モジュールを利用する（複数可）

こんにちは、オークファンの @dz_ こと大平かづみです。

Prologue - はじめに
====================
Azure の PaaS である [Web Apps](https://azure.microsoft.com/ja-jp/services/app-service/web/ "Web App Service | Microsoft Azure") は、PHP も扱うことができます。

では、 Azure Web Apps で PHP の拡張モジュールを利用するにはどうしたらよいでしょうか？

普段、Linux で PHP のモジュールを扱うときは、so ファイルを配置して ini ファイルに設定する流れですが、PaaS かつ IIS (Microsoft 製の Web サーバー) なのでちょっとやり方が異なります。慣れてしまえばさくっとできるので、ご紹介いたします！

なお、公式ドキュメントではこちらにやり方が載っています。

- [方法: 既定の PHP ランタイムで拡張機能を有効にする](https://azure.microsoft.com/ja-jp/documentation/articles/web-sites-php-configure/#php-2 "方法: 既定の PHP ランタイムで拡張機能を有効にする")

Azure Web Apps で PHP 拡張モジュールを利用する方法
============

大まかな流れ
-----------------
なんと 3ステップでできちゃいます！

1. 入れたい PHPモジュールの dll ファイルを入手する
2. Azure Web Apps のドキュメントルート配下に、 dll ファイルを配置する
3. 「アプリケーション設定」>「アプリ設定」で、 `PHP_EXTENSIONS` にパスを設定する

前準備
---------
Azure Web Apps の環境がすでにある前提で進めます。

### phpinfo() を見れるようにする
今回、確認用に、`phpinfo()` をコールするだけの `index.php` を用意しました。

Azure Web Apps 内に簡単にファイルを作成・配置するには、「App Service Editor (旧 Visual Studio Online (Monaco)) 」か、「Advanced Tools (Kudu)」を利用するのがおすすめです。

### App Service Editor を利用した例
![20160911_azure-webapps_006.png](https://qiita-image-store.s3.amazonaws.com/0/3812/c77edc66-e8e2-cb55-e01e-487057052b5b.png)

![20160911_azure-webapps_009.png](https://qiita-image-store.s3.amazonaws.com/0/3812/995a6774-7582-72b8-0ab3-f35a64176a7e.png)

### PHPバージョンを確認しておく
ポータルから、PHP のバージョンを確認・指定することができます。本記事では PHP 5.6 (32bit) という環境で進めます。お好みに合わせて適宜変更してください。

![20160911_azure-webapps_008.png](https://qiita-image-store.s3.amazonaws.com/0/3812/f4e270fc-849b-1bd1-e002-84a26164fce9.png)

手順の解説
===============

1. PHP 拡張モジュールの dll ファイルを入手する
-----------------------------------------------
dll ファイルは、各開発元か、[PECL](https://pecl.php.net/ "PECL :: The PHP Extension Community Library") で探すと見つかります。なお、以下の互換に注意してください。

> PHP の既定バージョンとの互換性があり、**非スレッドセーフ (nts) 互換**

| PHP バージョン | VC バージョン |
|---------------|--------------|
| PHP 7.x       | VC14         |
| PHP 5.5, 5.6  | VC11         |
| PHP 5.4 以前  | VC9          |

参考: [Build your own PHP on Windows](https://wiki.php.net/internals/windows/stepbystepbuild "PHP: internals:windows:stepbystepbuild")

### 例) Redis モジュール

例えば、 Redis のモジュールの場合は、PECL で検索し Windows 用のダウンロードページを探します。 PHP 5.6 (32bit) の環境とすると、NTS の「5.6 Non Thread Safe (NTS) x86」(`php_redis-2.2.7-5.6-nts-vc11-x86.zip`) を選択します。（なお、 PHP 7.x 用もあります。）

- [PECL :: Package :: redis :: 2.2.7](https://pecl.php.net/package/redis/2.2.7/windows "PECL :: Package :: redis :: 2.2.7")

![20160911_azure-webapps_012.png](https://qiita-image-store.s3.amazonaws.com/0/3812/cf5f867f-95c4-047a-4da6-7d97292ca695.png)

### 例) Phalcon PHP Framework (拡張モジュールで取込み）

また、開発元から入手するパターンとして、私のお気に入りの [Phalcon PHP Framework](https://phalconphp.com/ "Phalcon - High Performance PHP Framework") も入れてみましょう！（個人的趣味）

以下の Windows 用 DLL ダウンロードページから、PHP 5.6 (32bit) で利用するとして、「Phalcon 3.0.1 - Windows x86 for PHP 5.6.0 NTS (vc11) 」(`phalcon_x86_vc11_php5.6.0_3.0.1_nts.zip`) を選択します。

- [Download Phalcon for Windows](https://phalconphp.com/en/download/windows "Download Phalcon for Windows")

![20160911_azure-webapps_013.png](https://qiita-image-store.s3.amazonaws.com/0/3812/42ee50cf-145c-1ba6-e6ae-d6bf45e29753.png)

それぞれ解凍して、 dll ファイルをご用意ください。

2. Azure Web Apps のドキュメントルート配下に、 dll ファイルを配置する
------------------------------------------------------------------
前準備の項でご紹介した「App Service Editor」か「Advanced Tools (Kudu)」で、ドキュメントルート (既定では `D:\site\wwwroot` ) に `bin` ディレクトリを作成します。その中に、 dll ファイルをアップロードしましょう。（Git など継続的インテグレーションを利用した話については、 Epilogue にて。）

### App Service Editor を使った例

App Service Editor を開くと、ドキュメントルートのディレクトリが開かれます。ここに、 `bin` ディレクトリを作成し（または、最初からある場合があります）、そこに dllファイルをドラッグアンドドロップするだけ！

![20160911_azure-webapps_011.png](https://qiita-image-store.s3.amazonaws.com/0/3812/d821f0ab-cf6b-8047-9596-9ef1fc60d381.png)

ちなみに、 `bin` 直下じゃなくても `bin\ext` などサブディレクトリに置いてもパスを指定すれば通りました。

3. 「アプリケーション設定」>「アプリ設定」で、 `PHP_EXTENSIONS` にパスを設定する
------------------------------------------------------------------------------
配置した dllファイルに対して、パスを指定しましょう。ポータルの「アプリケーション設定」>「アプリ設定」で、以下のように相対パスで設定します。複数ある場合は、 `,` コンマで区切ります。

![20160911_azure-webapps_015.png](https://qiita-image-store.s3.amazonaws.com/0/3812/a0e30380-cfda-a4dc-4d0d-ff9762bcb9c3.png)

### 例
| 変数名 | 値 |
|-------|----|
| `PHP_EXTENSIONS` |  `bin\php_redis.dll,bin\php_phalcon.dll` |

作業完了！
------------
これだけです！

`phpinfo()` を確認してみると、どちらの拡張モジュールも認識していることがわかります。

![20160911_azure-webapps_016.png](https://qiita-image-store.s3.amazonaws.com/0/3812/414e979c-2205-9412-a825-da0db81092b5.png)


簡単！ ヾ(o´∀｀o)ﾉ

Epilogue - おわりに
=====================
ちなみに私は、 dll ファイルをオンラインエディタや Kudu でアップするのではなく、git に同様のディレクトリ構成を作り、そこに dll ファイルをコミットしておく方法を取りました。

この方が見通しがいいし、バージョン管理ができてよいかと思います。さらに、 Azure Web Apps の「継続的インテグレーション設定」で自動デプロイを設定しておくと、さらに便利 (b’v｀●)b♪

```
Git リポジトリのルートディレクトリ
└ bin
　├ xxx.dll
　└ xxx.dll
```

ぜひ、ご参考になれば幸いです！