PHPとClassic ASP（レガシーASP）を共存させてみる

Classic ASPで作られたWebサイトを運用してるけど今後の機能拡張はPHPで行っていきたい！
みたいな人のために（いるかわかんないけど…）。

ASPの環境構築はこちらを参考にしてください。

[Windows10でClassic ASP（レガシーASP）実行環境を構築する](https://qiita.com/danishi/items/ded2131eefbe50c1e567)

# IISでPHPを動かせるようにする

## CGI機能の有効化

コンパネの「プログラムと機能」から「Windows機能の有効化または無効化」を選択。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/edf4cded-c40c-4dc0-b5d5-3eb2f8ae3d8a.png)

「インターネット インフォメーション サービス」->「World Wide Webサービス」->「アプリケーション開発機能」->「CGI」にチェックを入れる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/89a42c18-59e2-6bfd-d13a-584f4856d2f8.png)

OKを押すとCGI機能が有効になる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/c1e198b8-b98f-a935-7f4d-390ca6521ab8.png)

## PHPのインストール

[PHPのサイト](https://windows.php.net/download/)からNon Thread Safe版のZipをダウンロード。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/95bb4b92-bfae-ff98-5a9e-dfc8c7f257ce.png)

お使いの環境に合わせて64bitか32bitを選んでください。

展開したら適当な場所に置く。
今回はフォルダ名をphpにしてCドライブ直下に置いた。

phpフォルダに入ると`php.ini-development`というファイルがあるので、これをコピーして`php.ini`にリネームする。

同階層に`php-cgi.exe`があるのでこれをダブルクリックで実行、DOS窓が開いて何も表示されなければOK。

## IISの設定

IISマネージャーを開き、拡張子とPHPファイルの関連付けを行う。

対象のサイトを選択し、「ハンドラーマッピング」を選択する

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/96507/bc73a7e5-9c6e-ebd7-8ef6-0044e7084d2c.png)

「モジュール マップの追加」をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/e4a51afb-808d-2e36-08c2-51eca2980d52.png)

次のように入力。
PHPのパスは実際の環境に合わせて変更する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/07ba1a0a-5132-0304-755f-4f2b1d6cc86d.png)

要求の宣言を次のように設定。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/1e754e38-eada-06f0-6868-4dfe4ee0aaac.png)

「OK」を押すと次のようにダイアログが上がるので「はい」を選択。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/d705f015-1425-3587-95be-e58ab809f6aa.png)

PHP実行環境の設定はこれで完了。

## PHPの動作確認

ドキュメントルートに適当なPHPファイルを作る。

```php:index.php
<?php
phpinfo();
?>
```

「[http://localhost/index.php](http://localhost/index.php)」にアクセス。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/e068a229-2643-fdfe-2439-387846bd0724.png)

IISでPHPの動作が確認できた。

# 共存させてみる

PHPとASPで互いを呼び合うフォームを作ってみる。
両方ともファイルエンコーディングはUTF-8で保存すること。

```php:form.php
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
</head>
<body>
<p>
<?php
if(filter_input(INPUT_GET, 'val')){
  echo filter_input(INPUT_GET, 'val') . ' -> ';
}
?>
PHP
</p>
<form action="/form.asp?val=PHP" method="post">
  <div>
    <label for="msg">message:</label>
    <input type="text" name="msg" value="<?= filter_input(INPUT_POST, 'msg') ?>">
  </div>
  <div class="button">
    <button type="submit">Send your message.</button>
  </div>
</form>
</body>
</html>
```

```html:form.asp
<%@ CODEPAGE=65001 %>
<% Session.CodePage=65001 %>
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
</head>
<body>
<p>
<%
If Request.QueryString("val") <> "" Then
  Response.Write Request.QueryString("val") & " -> "
End If
%>
ASP
</p>
<form action="/form.php?val=ASP" method="post">
  <div>
    <label for="msg">message:</label>
    <input type="text" name="msg" value="<%= Request.Form("msg") %>">
  </div>
  <div class="button">
    <button type="submit">Send your message.</button>
  </div>
</form>
</body>
</html>
```

まずはPHPのページ「[http://localhost/form.php](http://localhost/form.php)」にアクセス。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/dfaa18a1-ffc9-e83e-3fca-04ee1bd0d094.png)

ボタンを押してASPのページに遷移する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/28107e28-d5af-a3ce-861c-00fc166cd20c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/dc3c97d7-1321-43a5-3fb4-7bb9bcca5f05.png)

またボタンを押してPHPのページに遷移する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/ef5350b3-0be5-39c9-a9e3-bd38c34b1570.png)

PHPとASPでパラメータを渡しつつ、互いのページが行き来しあえることが確認できた。

---

というわけで同一サイトでPHPとASPを動かすことはできましたが、お察しの通りステートレスなWebサイトにしかこれでは対応できません。

セッションを利用するステートフルなWebサイトでは、互いの言語がセッションを共有できないため、結局はPHPかASPかのどちらかでセッションを管理し、片方はステートレスな処理を担当することになると思います。

以上でした。