それでも Azure App Service Windows インスタンスで PHP を使いたい

# はじめに

PHP は、Apache Web サーバーだけでなく、Windows の IIS サーバーでもサポートされていました。
しかし、2022 年 11 月 28 日で、PHP バージョン 7.4 のサポートが終了になり、かつ Windows での PHP バージョン 8.0 以降はサポートしなくなりました。なお、この方針は、2 年くらい前 (2020 年 7 月) にアナウンスされています。

https://news-web.php.net/php.internals/110907

もちろん、この方針は、Azure (Azure App Service Windows インスタンスも含む) でも変わりません。

https://azure.microsoft.com/ja-jp/updates/community-support-for-php-74-is-ending-on-28-november-2022/?WT.mc_id=AZ-MVP-5003113

https://github.com/Azure/app-service-linux-docs/blob/master/Runtime_Support/php_support.md#end-of-life-for-php-74

サポート終了後も引き続き PHP アプリケーションは動作しますが、セキュリティパッチのサポートなどは提供されませんし、いつまで PHP アプリケーションが動作し続けられるかも不明です。...とても不安ですね。:cold_sweat:

https://jpazpaas.github.io/blog/2022/11/15/PHP7.4_EoL.html


# それでも Azure App Service Windows インスタンスで PHP を使いたい！

引き続き Azure App Service Windows インスタンス上で PHP アプリケーションを動作させたい場合は、[Project Nami](https://projectnami.org/) チームが用意してくれた「PHP x64」を Azure App Service Windows インスタンスに導入すれば何とかなりそうです。

https://github.com/ProjectNami/php-azure-windows-web-app

本投稿は、これを実際に導入してみた時の備忘録として書き残しておきます。


# PHP ver. 8.x を導入する

[前述のリポジトリ](https://github.com/ProjectNami/php-azure-windows-web-app)を検証環境に展開します。


## 検証環境

- **Azure App Service**
    - OS : Windows
    - 言語スタック : PHP
    - PHP バージョン : PHP 7.4
    - プラットフォーム : 32 Bit
- **Azure App Service Plan**
    - SKU : Basic ※**Basic 以上**である必要があります


## 検証環境を確認 (導入前)

App Service リソースの構成設定を確認してみます。
Azure ポータルで、App Service リソースの [設定] カテゴリの [構成] を開き、[全般設定] タブの「言語スタックとバージョン」、「プラットフォーム」を確認します。

言語は「PHP 7.4」で、プラットフォームは「32 Bit」ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/a063b769-cfc8-a5a4-edc7-d94116e50c6a.png)

次に、実行している PHP のバージョンと設定情報を確認してみます。
Azure ポータルで、App Service リソースの [開発ツール] カテゴリの [コンソール] を開いて、以下のコマンドで「PHP バージョン」と「PHP 設定情報」を確認します。

```bash
# PHP バージョンを確認
php -v
# PHP 設定情報を確認
php -i | HEAD
```

PHP バージョンは「7.4.30」ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/b75f6950-46da-a5bc-f09f-cb7d21fcc134.png)


## PHP ver.8.x をデプロイする

### PHP ver.8.x コンテンツをアップロードする

以下より入手します。

https://github.com/ProjectNami/php-azure-windows-web-app/releases

検証時は「PHP ver. 8.1」がリリースされていたので、この ZIP ファイルをダウンロードして、解凍しておきます。

https://github.com/ProjectNami/php-azure-windows-web-app/archive/refs/tags/8.1.zip

FTP クライアントを使ってアップロードしますので、「FTP エンドポイント」と「資格情報」を入手します。Azure ポータルで、App Service リソースの [デプロイメント] カテゴリの [デプロイ センター] を開き、[FTPS 資格情報] タブで確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/b9d820cc-6e5e-3e7e-6072-f2e3be669c87.png)

あ。FTP 接続できるようにしておくことを忘れずに。:sweat_smile:
Azure ポータルで、App Service リソースの [設定] カテゴリの [構成] を開き、[全般設定] タブの [FTP の状態] を有効にしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/51f347f5-afd9-8af9-b842-6fbac37f5cee.png)

FTP クライアントで接続して、```/site/wwwroot``` フォルダー配下に ```/bin``` フォルダー、さらにその下に ```/php``` フォルダー を作成して、ディレクトリを移動します。

先ほど ZIP 解凍したコンテンツすべてを ```/site/wwwroot/bin/php``` フォルダーにアップロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/eaa293cf-c0da-a1ad-c188-f3f28ff02f7d.png)

アップロードし終わったら、FTP サイトから切断して、FTP クライアントを閉じます。


### 構成を設定する

Azure ポータルで、App Service リソースの [設定] カテゴリの [構成] を開き、[パスのマッピング] タブで、[新しいハンドラー マッピング] をクリック、以下の情報を入力して追加します。

| 設定項目 | 設定値 |
|:-|:-|
| 拡張子 | *.php |
| スクリプト プロセッサ | D:\home\site\wwwroot\bin\php\php-cgi.exe |
| 引数 | (空欄) |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/4c8875ac-0326-e8c0-1260-72fee5ce66d2.png)

[アプリケーション設定] タブで、[新しいアプリケーション設定] をクリック、以下の情報を入力して追加します。

| 設定項目 | 設定値 |
|:-|:-|
| 名前 | PHP_FCGI_MAX_REQUESTS |
| 値 | 10000 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/bc77a7d3-776c-43d9-4f26-0329be81f816.png)

[全般設定] タブで、以下の項目を変更します。

| 設定項目 | 設定値 |
|:-|:-|
| 言語スタック | PHP 以外の言語 |
| 言語バージョン | 適当に |
| プラットフォーム | 64 Bit |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/b3380964-9ce7-4ee5-d1fd-e741807f9f87.png)

なお、**App Service Plan の SKU が「Basic」以上でないとプラットフォームで「64 Bit」を指定することができません。** アップグレードしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/e9860078-a556-b9a1-50bd-c4f912896446.png)

最後に、[保存] をクリックして、今までの設定を保存します。

では、PHP ver. 8.x 対応の PHP アプリをデプロイして、念のため App Service リソースを再起動しておきましょう。


## 検証環境を確認 (導入後)

[導入前](#%E6%A4%9C%E8%A8%BC%E7%92%B0%E5%A2%83%E3%82%92%E7%A2%BA%E8%AA%8D-%E5%B0%8E%E5%85%A5%E5%89%8D)と同じように 、Azure ポータルで App Service リソースの [開発ツール] カテゴリの [コンソール] で ```php -v``` と ```php -i | HEAD``` コマンドを実行して、「PHP バージョン」と「PHP 設定情報」を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/22674d39-5d71-61e8-0774-781aea802ce3.png)

検証時は以下のように出力されました。
それぞれこのように出力されていれば、ダイジョウブでしょう！:v:

```bash
>php -v
PHP 8.1.12 (cli) (built: Oct 25 2022 18:20:48) (NTS Visual C++ 2019 x64)
Copyright (c) The PHP Group
Zend Engine v4.1.12, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.12, Copyright (c), by Zend Technologies

>php -i | HEAD
phpinfo()
PHP Version => 8.1.12

System => Windows NT RD00155DB122A5 10.0 build 14393 (Windows Server 2016) AMD64
Build Date => Oct 25 2022 18:16:43
Build System => Microsoft Windows Server 2019 Datacenter [10.0.17763]
Compiler => Visual C++ 2019
Architecture => x64
Configure Command => cscript /nologo /e:jscript configure.js  "--enable-snapshot-build" "--enable-debug-pack" "--disable-zts" "--with-pdo-oci=..\..\..\..\instantclient\sdk,shared" "--with-oci8-19=..\..\..\..\instantclient\sdk,shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet=shared" "--without-analyzer" "--with-pgo"
Server API => Command Line Interface
```

# まとめ

これで Azure App Service Windows インスタンス上で PHP アプリケーションを引き続き動作させることができそうです。が、いつまでもこれが通用するとは限らないので、これは「回避策」だと捉え、今後は「恒久的な対応」の検討と対処を行っていきましょう。:thinking:

なお、今回紹介した手順は、あくまで今まで動作していた PHP アプリケーションを維持させるための処置であり、正式なサポートではないことをご理解ください。そして、ご利用の際は自己責任でお願いします。:bow: