(Laravel/homestead)PHP7.2 のSQL Server用ドライバを設定しDBに接続するまで


homestead環境でLaravelプロジェクトからSQL Serverインスタンスに接続をするために、ubuntuにインストールしたPHP7.2 にSQL Server用ドライバ(pdo_sqlsrv)を設定します。(2019/1/24時点では、PHP7.3向けのSQL Serverドライバはリリースされていないため、PHP7.2を使用します。→Github: No stable release with PHP 7.3

前提条件

Windows10に構築したLaravel/Homestead (7.20.0) 環境で作成したLaravelプロジェクト (5.5) から SQL Server2017 Developper Edition にSQL Server認証で接続し、php artisan migrateで、デフォルトのUsersとPasswordResetテーブルを作成する手順を記載します。

Homesteadの構築手順は割愛します。
初回vagrant upした後の設定になります。

SQL Serverドライバの設定

ubuntu上のPHP7.2がSQL Serverに通信をするためのモジュールを設定します。

(1) ssh接続しphp72 を実行

php72

homesteadデフォルトのPHPのバージョンを7.2にするエイリアスのコマンドです。
(中身はvagrant upを実行したhomesteadのディレクトリのresources/aliasにスクリプトが存在しました。)

(2) pdo_sqlsrv をPHPモジュールに登録

下記のリンクに記載されている手順でスクリプトを実行して、pdo_sqlsrvを展開しました。
Linux と macOS の Microsoft Drivers for PHP for SQL Server のインストール
homesteadはubuntu18.04で、PHP7.2はインストール済みだったので実行スクリプトは下記の通りです。

sudo su 
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
curl https://packages.microsoft.com/config/ubuntu/18.04/prod.list > /etc/apt/sources.list.d/mssql-release.list

exit
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install msodbcsql17
sudo ACCEPT_EULA=Y apt-get install mssql-tools
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc
sudo apt-get install unixodbc-dev

sudo pecl install sqlsrv
sudo pecl install pdo_sqlsrv
sudo su
echo extension=pdo_sqlsrv.so >> `php --ini | grep "Scan for additional .ini files" | sed -e "s|.*:\s*||"`/30-pdo_sqlsrv.ini
echo extension=sqlsrv.so >> `php --ini | grep "Scan for additional .ini files" | sed -e "s|.*:\s*||"`/20-sqlsrv.ini
exit

以上のスクリプトでpeclでsqlsrvとpdo_sqlsrvがphpに登録されます。
nginxのリスタートをしてください。(hostでvagrant reloadなど)

SQL Server 2017 Developper をインストール

Host側のWin10に下記URLからSQL Server 2017の無償版(開発環境のみで使用可能)をインストールします。
https://www.microsoft.com/en-us/sql-server/sql-server-2017-editions
併せて、操作用にSQL Server Management Studioをインストールしておく。

ユーザー作成とSQL Server 認証設定

(1) ユーザー作成

SQL Server Management Studioのセキュリティ> ログインからSQL Serverにアクセスできる権限のユーザーを追加します。
SQL Server認証でユーザーID とPasswordを入力し接続できるようにします。

(2) SQL Server 認証の有効化

併せて、サーバーにログインする際の認証方法に、SQL Server認証も有効にします。
<<サーバー名>>を右クリック 
→ プロパティ → セキュリティ
→ Windows認証 と SQL Server認証を使用可能にする。

(3) SQL Server ポート設定

構成マネージャーからtcpipの接続情報を開き、2点設定をします。
1. Ipv1~Ipvallまですべて動的ポート設定をオフにする。
2. Ipv1~Ipvallまですべて開きたい任意のポート番号を設定する。

homesteadでLaravelプロジェクトを作成し、migrationを実行

cd ~/code
composer create-project Laravel/Laravel=5.5.* --prefer-dist <<プロジェクト名>>

.envファイルを下記の通り書き換えます。

DB_CONNECTION=sqlsrv
DB_HOST=<<hostのipアドレス>>
DB_PORT=<<先に設定したhostのsql serverのポート番号>>
DB_DATABASE=homestead
DB_USERNAME=<<先に作った接続用ユーザー名>>
DB_PASSWORD=<<先に作った接続ユーザーのパスワード>>

artisan コマンドでマイグレーションを実行します。

cd <<プロジェクト名>>
php artisan migrate

2019年1月31日追記-fpm経由でのphp実行時のiniファイルを追加してSQL Serverドライバの登録を行う

ブラウザでページにアクセスした際に、ドライバのエラーが出ました。
これはfpm経由でのphp実行時の設定情報を表示した際にSQL Serverドライバーの参照先が設定されていないからだと分かりました。

Iniファイルの一覧であるAdditional .ini files parsedの欄にSQL Serverドライバの設定を追加するには

Scan this dir for additional .ini filesの参照先に、下記のiniファイル
30-pdo_sqlsrv.ini
20-sqlsrv.ini
を追加して、SQL Serverドライバのパスを設定しなければならなかったようです。

対応

(1) phpinfo()を出力するbladeテンプレートをルーティング定義する。
(2) phpinfo()画面から、Scan this dir for additional .ini files の参照先をメモ
(3) メモしたディレクトリを下記コマンドに当てはめて実行

echo "extension=sqlsrv.so" >> [[メモしたディレクトリ]]/20-sqlsrv.ini
echo "extension=pdo_sqlsrv.so" >> [[メモしたディレクトリ]]/30-pdo_sqlsrv.ini

cliでのphp artisan migrateの時にはcli向けのiniファイルを、リクエストに対してサーバーソフトウェアがphpを実行する時にはまた別のiniファイルを読み込むようです。

以上です。