そういうわけで、頭を抱えながらWebをさまよったところ、次のWebページが非常に役に立つことが分かった。
簡単にまとめると、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>
「Using LocalDB with Full IIS, Part 2: Instance Ownership」ページには、幾つかの対処策が記されているが、ここではLocalDBの「共有インスタンス」を使う方法を試してみよう。これには次の2つの手順を踏む。
前者を行うには「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;
}
PHP Server拡張機能を使ってホストすると、次のように共有インスタンスにアクセスして、ToDoリストアプリが動いているのが確認できる(ポート3000で動いているので、PHP Server拡張機能でホストされていることが分かる)。
ただし、この状態でIISにデプロイをしても、まだPHPアプリは動かない。PHPアプリが実行されるアプリケーションプール(ここではDefaultAppPool)から共有インスタンスにアクセスできないからだ。これには例えば、SQL Server Management Studioで「(localDB)\.\todolist_db」に接続して、オブジェクトエクスプローラーの[セキュリティ]ツリーを展開し、[ログイン]ノードから新しくログインを作成する必要がある。あるいは、「Using LocalDB with Full IIS, Part 2: Instance Ownership」ページで紹介されているのと同様なクエリを実行してもよい(アプリケーションプール名は適切なものに変更する必要がある)。
新しいログインの作成
最後に、IISマネジャーで、冒頭で作成した「phptodolist」を右クリックして、コンテキストメニューから[仮想ディレクトリの管理]−[詳細設定]を選択し、[物理パス資格情報]を(例えば、現在VS CodeでPHPアプリ開発をしているユーザー自身に)設定しておこう。
以上の設定を行い、VS CodeからDeploy Reloaded拡張機能を使って、IISへデプロイすることで、PHPアプリがIISでも動作するようになるはずだ。macOS上で動作するブラウザから、このPHPアプリにアクセスしているところを以下に示す。
本稿では、IISでLocalDBインスタンスにアクセスできるようにしながら、VS CodeでのPHPコードのデバッグの様子や、LocalDB共有インスタンスの作成などを紹介した。データベースファイルをアタッチする話や、htmlspecialchars関数関連の話もしたかったところだが、興味のある方はそれぞれが調べてみてほしい。本連載では簡単なToDoリストアプリの作成にとどめたが、部内向けにちょっとしたサービスを作成する必要に迫られた場合の参考になれば幸いだ。
Copyright© Digital Advantage Corp. All Rights Reserved.