ポイントは以下の2点です。
- ドライバの導入: Linux用のMicrosoft公式ドライバとPHP拡張機能を入れる必要がある。
- ネットワーク: WSL2(Linux)からWindows(ホスト)を見るための特別な設定が必要。
手順1:Microsoft ODBCドライバのインストール
UbuntuにSQL Serverと通信するための土台(ODBC Driver 18)をインストールします。
ターミナルで以下のコマンドを1行ずつ実行してください。 (※Ubuntuのバージョンが22.04または24.04と仮定していますが、一般的なコマンドです)h
# 1. 必要なツールのインストール
sudo apt-get install -y curl gnupg2
# 2. Microsoftの公開鍵を登録
curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
# 3. リポジトリの登録(Ubuntuのバージョンを自動判定して登録します)
curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list
# 4. パッケージリストの更新
sudo apt-get update
# 5. ODBCドライバのインストール
# ※途中でライセンス条項への同意画面が出るので「YES」を選択してEnter
sudo apt-get install -y msodbcsql18 unixodbc-dev
手順2:PHP拡張機能(sqlsrv, pdo_sqlsrv)のインストール
PHPからドライバを使うための拡張機能をインストールします。これには pecl コマンドを使います。
# 1. PHP開発用ツールとPECLのインストール
sudo apt-get install -y php-dev php-pear build-essential
# 2. SQL Server用PHP拡張のコンパイルとインストール
sudo pecl install sqlsrv
sudo pecl install pdo_sqlsrv
手順3:PHPの設定ファイルへの登録
インストールした拡張機能をPHPに認識させます。
- 以下のコマンドを実行して設定ファイルを作成します。
# sqlsrvの有効化echo "extension=sqlsrv.so" | sudo tee /etc/php/8.1/mods-available/sqlsrv.ini
#pdo_sqlsrvの有効化echo "extension=pdo_sqlsrv.so" | sudo tee /etc/php/8.1/mods-available/pdo_sqlsrv.ini
(注意: 上記コマンドの8.1の部分は、php -vで確認したバージョンに合わせて8.2や8.3に変更してください) - 設定を反映させます。
sudo phpenmod sqlsrv pdo_sqlsrvsudo service apache2 restart
WSL2上のUbuntu(PHP 8 + Apache)から、Windows側にインストールされているSQL Serverに接続するには、MySQLよりも少し手順が多くなります。
主なハードルは以下の2点です。
- ドライバの導入: Linux用のMicrosoft公式ドライバとPHP拡張機能を入れる必要がある。
- ネットワーク: WSL2(Linux)からWindows(ホスト)を見るための特別な設定が必要。
以下に手順をまとめました。
手順1:Microsoft ODBCドライバのインストール
UbuntuにSQL Serverと通信するための土台(ODBC Driver 18)をインストールします。
ターミナルで以下のコマンドを1行ずつ実行してください。 (※Ubuntuのバージョンが22.04または24.04と仮定していますが、一般的なコマンドです)
Bash
# 1. 必要なツールのインストール
sudo apt-get install -y curl gnupg2
# 2. Microsoftの公開鍵を登録
curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
# 3. リポジトリの登録(Ubuntuのバージョンを自動判定して登録します)
curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list
# 4. パッケージリストの更新
sudo apt-get update
# 5. ODBCドライバのインストール
# ※途中でライセンス条項への同意画面が出るので「YES」を選択してEnter
sudo apt-get install -y msodbcsql18 unixodbc-dev
手順2:PHP拡張機能(sqlsrv, pdo_sqlsrv)のインストール
PHPからドライバを使うための拡張機能をインストールします。これには pecl コマンドを使います。
Bash
# 1. PHP開発用ツールとPECLのインストール
sudo apt-get install -y php-dev php-pear build-essential
# 2. SQL Server用PHP拡張のコンパイルとインストール
sudo pecl install sqlsrv
sudo pecl install pdo_sqlsrv
手順3:PHPの設定ファイルへの登録
インストールした拡張機能をPHPに認識させます。
- 以下のコマンドを実行して設定ファイルを作成します。Bash
# sqlsrvの有効化 echo "extension=sqlsrv.so" | sudo tee /etc/php/8.1/mods-available/sqlsrv.ini # pdo_sqlsrvの有効化 echo "extension=pdo_sqlsrv.so" | sudo tee /etc/php/8.1/mods-available/pdo_sqlsrv.ini(注意: 上記コマンドの8.1の部分は、php -vで確認したバージョンに合わせて8.2や8.3に変更してください) - 設定を反映させます。Bash
sudo phpenmod sqlsrv pdo_sqlsrv sudo service apache2 restart
手順4:接続コード(PHPソース)の修正
ここがWSL2特有の最大のポイントです。 Ubuntuから見て「Windows」は localhost ではありません。
1. ホスト名の指定
接続文字列(DSN)のサーバー名には、WindowsマシンのIPアドレスを指定する必要がありますが、WSL2では以下の特殊な名前でWindowsを指すことができます。
- サーバー名:
$(hostname).local(例:MY-PC.local) - またはIPアドレス:
/etc/resolv.confに書いてあるIP(少し面倒なのでホスト名推奨)
2. サンプルコード
PDOを使った接続例です。ODBC Driver 18からはセキュリティが厳しくなっているため、TrustServerCertificate=yes が重要です。
<?php
// WindowsのPC名に ".local" をつけるか、WindowsのIPアドレスを指定
$serverName = "あなたのPC名.local, 1433"; // ポート1433を指定
$connectionOptions = [
"Database" => "データベース名",
"Uid" => "sa", // SQL Server認証のユーザー名
"PWD" => "パスワード", // SQL Server認証のパスワード
// 【重要】開発環境では証明書エラーを回避するために必須
"TrustServerCertificate" => "yes",
"Encrypt" => "yes"
];
try {
// DSNの構築
$dsn = "sqlsrv:server=$serverName;Database=" . $connectionOptions['Database'] .
";TrustServerCertificate=yes;Encrypt=yes";
$conn = new PDO($dsn, $connectionOptions['Uid'], $connectionOptions['PWD']);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "接続成功!";
} catch (PDOException $e) {
echo "接続失敗: " . $e->getMessage();
}
?>
手順5:Windows側(SQL Server)の設定確認
コードが正しくても、Windows側で拒否されることがよくあります。以下の3点を確認してください。
- SQL Server認証モードの有効化
- WSL(Linux)からは「Windows統合認証」が使えません。
- SQL Server Management Studio (SSMS) でサーバーのプロパティを開き、セキュリティで「SQL Server認証モードとWindows認証モード」を選択し、
saユーザーなどを有効にしてください。
- TCP/IP接続の許可
- スタートメニューから「SQL Server Configuration Manager(構成マネージャー)」を開きます。
- 「SQL Server ネットワークの構成」→「(インスタンス名)のプロトコル」を選択。
- TCP/IP が「有効」になっていることを確認してください。
- Windowsファイアウォール
- Windowsのファイアウォールで、ポート 1433 の受信接続を許可するルールを追加する必要がある場合があります。
トラブルシューティングのヒント
もし接続できない場合は、Ubuntuターミナルから ping を打ってみてください。
Bash
ping あなたのPC名.local
これで応答があればネットワークは繋がっています。エラーが出る場合は、WindowsのIPアドレス(Windowsのコマンドプロンプトで ipconfig で確認)を直接PHPに記述して試してください。