連載
» 2018年11月13日 05時00分 公開

VS CodeとPHPとSQL Server(LocalDB)で作ったアプリをIISへデプロイ.NET開発者のためのPHPアプリお手軽開発入門(2/2 ページ)

[かわさきしんじ,Insider.NET編集部]
前のページへ 1|2       

IISからLocalDBを使うために必要なこと

 そういうわけで、頭を抱えながらWebをさまよったところ、次のWebページが非常に役に立つことが分かった。

 簡単にまとめると、IISからLocalDBを使用する際には以下が問題となるということだ。

  • ユーザープロファイルをロードする必要がある
  • LocalDBはVS Codeを使っているユーザーによって起動され、そのユーザーがLocalDBインスタンスを所有している。一方、IISで実行されるアプリは別のユーザーによって実行されるので、VS Codeからは見えたLocalDBインスタンスがIIS上のアプリからは見えない

 要するに、次のことをすればよい。

  • ユーザープロファイルをロードするようにする
  • IISからLocalDBにアクセスできるようにする

 以下ではこれらの修正を行っていこう。

ユーザープロファイルをロードするようにする

 前者については「Using LocalDB with Full IIS, Part 1: User Profile」ページを参考にして、「C:\Windows\System32\inetsrv\Config\applicationHost.config」ファイルを次のように修正した(本連載ではDefaultAppPoolをアプリケーションプールとして利用しているため。PHP用に別途アプリケーションプールを作成する場合は、該当するアプリケーションプールに設定を追加する)。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <!-- 省略 -->

  <system.applicationHost>
    <applicationPools>
      <add name="DefaultAppPool">
        <processModel identityType="ApplicationPoolIdentity"
                      loadUserProfile="true"
                      setProfileEnvironment="true" />
      </add>
      <applicationPoolDefaults managedRuntimeVersion="v4.0">
        <processModel identityType="ApplicationPoolIdentity"
                      loadUserProfile="true"
                      setProfileEnvironment="false" />
      </applicationPoolDefaults>
    </applicationPools>

  </system.applicationHost>

  <!-- 省略 -->

</configuration>

applicationHost.configファイルの修正

IISからLocalDBにアクセスできるようにする

 「Using LocalDB with Full IIS, Part 2: Instance Ownership」ページには、幾つかの対処策が記されているが、ここではLocalDBの「共有インスタンス」を使う方法を試してみよう。これには次の2つの手順を踏む。

  • 共有インスタンスを開始する
  • 共有インスタンスへIISからアクセスできるようにする

 前者を行うには「sqllocaldb share <プライベート名> <共有名>」コマンドをコンソールから実行すればよい。ここでは次のようにした。なお、共有インスタンスを作成するには管理者権限が必要になるので、コマンドプロンプトなどを管理者として実行しておく必要があることには注意しよう。

C:\WINDOWS\system32>sqllocaldb share vscphpwebapps todolist_db
プライベート LocalDB インスタンス "vscphpwebapps" は共有名 "todolist_db" で共有
します。

C:\WINDOWS\system32>sqllocaldb info
.\todolist_db ← 作成した共有インスタンス
MSSQLLocalDB
vscphpwebapps


共有インスタンスの作成

 作成した共有インスタンスには「.\<共有名>」のようにしてアクセスが可能だ(共有を解除するには「sqllocaldb unshare .\<共有名>」コマンドを実行する)。例えば、上の場合なら「(localdb)\.\todolist_db」としてアクセスできる(SQL Server Management Studioなどでも同様)。そこで、util.phpファイルのコードを次のように修正して、まずはIISではなくPHP Server拡張機能を使って実行してみよう。

<?php
function openDb() {
  $serverName = "(localDB)\\.\\todolist_db";
  $uid = "sa";
  $pwd = "**********";
  $dbname = "todolist";
  $dsn = "sqlsrv:server=" . $serverName . ";database=" . $dbname;

  try {
    $pdo = new PDO($dsn, $uid, $pwd);
  } catch (Exception $e) {
    throw $e;
  }
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  return $pdo;
}


修正後のutil.phpファイル

 PHP Server拡張機能を使ってホストすると、次のように共有インスタンスにアクセスして、ToDoリストアプリが動いているのが確認できる(ポート3000で動いているので、PHP Server拡張機能でホストされていることが分かる)。

共有インスタンスを利用したToDoリストアプリ(PHP Server拡張機能で実行) 共有インスタンスを利用したToDoリストアプリ(PHP Server拡張機能で実行)

 ただし、この状態でIISにデプロイをしても、まだPHPアプリは動かない。PHPアプリが実行されるアプリケーションプール(ここではDefaultAppPool)から共有インスタンスにアクセスできないからだ。これには例えば、SQL Server Management Studioで「(localDB)\.\todolist_db」に接続して、オブジェクトエクスプローラーの[セキュリティ]ツリーを展開し、[ログイン]ノードから新しくログインを作成する必要がある。あるいは、「Using LocalDB with Full IIS, Part 2: Instance Ownership」ページで紹介されているのと同様なクエリを実行してもよい(アプリケーションプール名は適切なものに変更する必要がある)。

[ログイン]を右クリックして、コンテキストメニューから[新しいログイン]を選択
[ログイン]を右クリックして、コンテキストメニューから[新しいログイン]を選択
[ログイン名]に「IIS APPPOOL\DefaultAppPool」と入力して、[OK]ボタンをクリック
[ログイン名]に「IIS APPPOOL\DefaultAppPool」と入力して、[OK]ボタンをクリック

新しいログインの作成


 最後に、IISマネジャーで、冒頭で作成した「phptodolist」を右クリックして、コンテキストメニューから[仮想ディレクトリの管理]−[詳細設定]を選択し、[物理パス資格情報]を(例えば、現在VS CodeでPHPアプリ開発をしているユーザー自身に)設定しておこう。

[物理パス資格情報]を修正 [物理パス資格情報]を修正

 以上の設定を行い、VS CodeからDeploy Reloaded拡張機能を使って、IISへデプロイすることで、PHPアプリがIISでも動作するようになるはずだ。macOS上で動作するブラウザから、このPHPアプリにアクセスしているところを以下に示す。

macOSからIIS上で動作しているToDoリストアプリにアクセスしたところ macOSからIIS上で動作しているToDoリストアプリにアクセスしたところ


 本稿では、IISでLocalDBインスタンスにアクセスできるようにしながら、VS CodeでのPHPコードのデバッグの様子や、LocalDB共有インスタンスの作成などを紹介した。データベースファイルをアタッチする話や、htmlspecialchars関数関連の話もしたかったところだが、興味のある方はそれぞれが調べてみてほしい。本連載では簡単なToDoリストアプリの作成にとどめたが、部内向けにちょっとしたサービスを作成する必要に迫られた場合の参考になれば幸いだ。

「.NET開発者のためのPHPアプリお手軽開発入門」のインデックス

.NET開発者のためのPHPアプリお手軽開発入門

前のページへ 1|2       

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。