SQL Server用のPHP用Microsoftドライバを読み込む

SQLSRVとPDO_SQLSRVドライバはPHP拡張です。 PHPはPHPプロセス開始時に php.ini や追加の .ini ファイルを読み込みます。

読み込みはインストールとは別です。 拡張機能をコピーまたはビルドすると、ファイルがディスク上に置かれます。 PHPは、アクティブな構成に正しいエントリが含まれてPHPプロセスが再起動されるまではSQLSRVやPDO_SQLSRVを使えません。

Web 診断ページを保護する

一時的な phpinfo() ページを作成する前に、localhost からのリクエストまたは認証された管理者のみを許可するようにウェブサーバーを設定してください。 その制限はページを削除するまで維持してください。 phpinfo() は、環境変数、認証情報、サーバー設定を公開する可能性があります。 認証後すぐにページを削除してください。

PHPの設定範囲を理解する

各PHPサーバーアプリケーションプログラミングインターフェース(SAPI)は、異なる実行ファイルと構成を使用できます:

ランタイム 一般的な構成元 識別方法
コマンド ライン インターフェイス (CLI) php --ini によって報告された php.ini とスキャン ディレクトリ 実行可能ファイルで php --ini を実行する
IIS FastCGI IIS FastCGIアプリケーションで設定されたPHP実行ファイル 一時的な phpinfo() ページを使う
Apache モジュール ApacheのPHPモジュール構成 一時的な phpinfo() ページを使う
PHP-FPM FPM実行ファイル、プール、 php.ini、スキャンディレクトリ バージョン付き FPM バイナリを -i で実行するか、一時的な phpinfo() ページを使用する
実行時間の長いワーカー ワーカーを起動した実行ファイルと環境 ワーカーサービスを点検し、変更後に再起動してください

CLIの設定を変更しても、他のPHPインストールやスキャンディレクトリを使っている場合、IIS、Apache、PHP-FPM は変わりません。

PHPの設定を見つけてください

アプリケーションで使うPHP実行ファイルで以下のコマンドを実行します:

php --ini
php -i | findstr /I "PHP Version Thread Safety Architecture extension_dir"

LinuxやmacOSでは、 findstr を grepに置き換えてください:

php -i | grep -E "PHP Version|Thread Safety|extension_dir"
file "$(php -r 'echo PHP_BINARY;')"

fileコマンドは選択した実行ファイルのアーキテクチャを識別します。 汎用macOS実行ファイルの場合は、 明示的なアーキテクチャ選択に従ってください。

[読み込まれた構成ファイル] と [次の中にある追加の .ini ファイルをスキャンする] の値で、コマンドライン プロセスで使用される構成を特定します。 ウェブサーバーや PHP FastCGIプロセスマネージャー(PHP-FPM) プロセスは異なるPHP実行ファイルや設定ファイルを使うことがあります。 一時的な phpinfo() ページを使って、そのプロセスの値を特定しましょう。

ファイルを編集する前に、以下を記録してください:

  • PHPの実行可能パスとバージョン。
  • 読み込まれた php.ini。
  • 追加の .ini スキャン ディレクトリ。
  • 拡張機能ディレクトリ。
  • スレッドセーフティモードとアーキテクチャ。
  • 再起動する必要があるすべてのプロセス。

変更した設定ファイルはすべてバックアップしてください。

Windowsでドライバーを読み込む

PHP Installer for Extensions(PIE)でのインストールでは、まずPIEをダウンロードして検証してください。 pie.phar を含むディレクトリから、ドライバーを読み込む必要のある PHP 実行可能ファイルを使って次のコマンドを実行します。

php .\pie.phar install microsoft/sqlsrv
php .\pie.phar install microsoft/pdo_sqlsrv

PIEは php_sqlsrv.dll と php_pdo_sqlsrv.dllをインストールします。 PIEが拡張機能を自動的に有効にできない場合は、既存のSQLSRVやPDO_SQLSRVエントリをアクティブな php.iniから削除し、以下を追加してください:

extension=php_sqlsrv.dll
extension=php_pdo_sqlsrv.dll

各ドライバーにつき1件のみ登録してください。 設定を変更した後、PHPプロセスを再起動してください。

ZIPインストールの場合、PHPのマイナーバージョン、アーキテクチャ、スレッドセーフティモードに一致する動的リンクライブラリ(DLL)を extension_dir ディレクトリにコピーします。 PHP 8.5 x64のスレッドセーフランタイムは以下のファイル名を使用します。

php_sqlsrv_85_ts_x64.dll
php_pdo_sqlsrv_85_ts_x64.dll

PHPプロセスで使用される php.ini に両方のファイル名を追加します:

extension=php_sqlsrv_85_ts_x64.dll
extension=php_pdo_sqlsrv_85_ts_x64.dll

85、ts、x64 を、自身の PHP ランタイムの値に置き換えます。 スレッドセーフと非スレッドセーフファイル、32ビットと64ビットファイル、または別のPHPマイナーバージョン用に作成されたファイルを混同しないでください。

Linux と macOS でドライバーをロードする

PIEを使ってドライバーをインストールしてください。 詳細については、 LinuxおよびmacOSのインストールチュートリアルをご覧ください。 PIEは拡張機能ファイルをインストールし、プラットフォームのPHP設定ツールを使用するか、追加のphp.iniファイルまたは標準extension=に.iniエントリを追加することで、それらを有効にしようとします。 PIEが拡張機能を有効にできないと報告した場合は、自分でエントリを追加し、アクティブな構成を確認してください。

手動インストールの場合は、PHPのバージョン、アーキテクチャ、スレッドセーフティモード、OSのネイティブライブラリに合った既製の .so ファイルを選択してください。 ビルド済みのLinuxおよびmacOSの要件を確認してください。環境に合わなければPIEを使いましょう。

例えば、PHP 8.4の非スレッドセーフファイルは SQLSRV_8.4_NTS.so と PDO_SQLSRV_8.4_NTS.soと名付けられています。 php -i | grep extension_dirが返したディレクトリに入れてください。 sqlsrv.so と pdo_sqlsrv.so に名前を変更して以下のエントリを使うか、代わりにエントリ内で正確なパッケージファイル名を使うようにしてください。 このセクションで説明されているロードオーダーに従って、アクティブなPHP構成にエントリを追加してください:

extension=sqlsrv.so
extension=pdo_sqlsrv.so

PHPデータオブジェクト(PDO)はPDO_SQLSRV前にロードしなければなりません。 PHPは php.ini を読み込み、その後追加の .ini ファイルをアルファベット順にスキャンします。 ディストリビューションがスキャン済みファイルから pdo.so を読み込む場合は、PDO_SQLSRVエントリを後からスキャンされるファイル( 30-pdo_sqlsrv.ini 例えばPDOが 10-pdo.iniを使う場合など)に置きましょう。 その場合はPDO_SQLSRVのエントリーを php.ini に入れないでください。

拡張機能の項目を選択

ドライバーのインストール方法に合致するエントリを使いましょう:

プラットフォームと方法 SQLSRVエントリ PDO_SQLSRVエントリ
Windows with PIE extension=php_sqlsrv.dll extension=php_pdo_sqlsrv.dll
Windows のリリースされた ZIP 正確なバージョン指定のDLL名、例えば extension=php_sqlsrv_85_ts_x64.dll 正確なバージョン指定のDLL名、例えば extension=php_pdo_sqlsrv_85_ts_x64.dll
PIE を備えた Linux または macOS extension=sqlsrv.so extension=pdo_sqlsrv.so
Linux または macOS のリリースされたアーカイブ、名前が変更されたファイル extension=sqlsrv.so extension=pdo_sqlsrv.so
LinuxまたはmacOS向けの配布アーカイブ、オリジナルファイル 正確なアーカイブ ファイル名 (extension=SQLSRV_8.4_NTS.so など) 正確なアーカイブ ファイル名 (extension=PDO_SQLSRV_8.4_NTS.so など)

同じ拡張機能に対して、ショートネームとバージョン付き名前の両方を設定しないでください。 PHPはモジュールがすでに読み込まれていることを報告したり、アップグレード後も古いファイルの読み込みを継続したりできます。

PHPを再起動して、ドライバーを読み込んでください

拡張ファイルや設定ファイルを変更した後にプロセスを再起動してください。 ウェブサーバー、PHP-FPM、キューワーカー、そしてドライバーを読み込む他の長期間実行するPHPプロセスを再起動してください。

SQLSRVとPDO_SQLSRV拡張は別々に読み込むことができますが、両方のドライバを使う場合は両方をインストールして検証してください。 PDOは多くのPHPパッケージに組み込まれています。 もしPDOが内蔵されていないなら、PDO_SQLSRVの前にPDO拡張機能を有効にしてください。

ロードされたドライバーの確認

コマンドライン実行時には、以下を実行:

php --ri sqlsrv
php --ri pdo_sqlsrv
php -m | findstr /I "sqlsrv pdo_sqlsrv"

LinuxやmacOSでは、以下をご利用ください:

php --ri sqlsrv
php --ri pdo_sqlsrv
php -m | grep -E "sqlsrv|pdo_sqlsrv"

ウェブサーバーの場合は、を含む一時的なページを作成する前に<?php phpinfo(); ?>してください。 読み込まれた設定ファイル、extension_dir、sqlsrvとpdo_sqlsrvのセクションを別々に確認してください。 認証後にページを削除してください。

また、PHPレベルのチェックを実行し、モジュール名だけでなく両方のAPIを検証できるようにしてください。 このプログラムを verify-php-drivers.phpとして保存してください:

<?php
$checks = [
    'SQLSRV extension' => extension_loaded('sqlsrv'),
    'SQLSRV API' => function_exists('sqlsrv_connect'),
    'PDO_SQLSRV extension' => extension_loaded('pdo_sqlsrv'),
    'PDO_SQLSRV API' => class_exists('PDO')
        && in_array('sqlsrv', PDO::getAvailableDrivers(), true),
];

$failed = false;
foreach ($checks as $name => $passed) {
    echo $name . ': ' . ($passed ? 'loaded' : 'missing') . PHP_EOL;
    $failed = $failed || !$passed;
}

exit($failed ? 1 : 0);

アプリケーションが使用する各PHP実行ファイルでプログラムを実行します:

php verify-php-drivers.php

予想される出力:

SQLSRV extension: loaded
SQLSRV API: loaded
PDO_SQLSRV extension: loaded
PDO_SQLSRV API: loaded

ウェブランタイムの場合は、ファイルを一時的にドキュメントのルートに置き、ブラウザからアクセスします。 確認後に削除してください。 このプログラムはデータベース接続を開いたり、設定値を印刷したりしません。

CLIとウェブランタイムのチェックが終わったら verify-php-drivers.php を削除してください。

ドライバーの読み込みに関するトラブルシューティング

症状: 確認すべき原因 是正措置
Unable to load dynamic library ファイル名、extension_dir、PHPのマイナーバージョン、アーキテクチャ、またはスレッドセーフティモードが正しくありません 選択したドライバー ファイルと php -i を比較し、一時的に絶対パスを使ってパス エラーを隔離する
Windows の場合: The specified module could not be found ドライバーのDLLやその依存関係のどれかが利用できません DLL が extension_dir にあることを確認し、一致する Visual C++ ランタイムをインストールし、残りの不足 DLL 依存関係を調査する
undefined symbol またはLinuxやmacOSでの共有ライブラリエラー 拡張機能とPHPのビルドの不一致、またはODBC依存性の欠如 意図した php-configで再構築し、不足していると報告されたライブラリを点検します
Module "sqlsrv" is already loaded 重複エントリまたは 2 つのスキャン済みファイル 読み込まれた php.ini を検索してディレクトリをスキャンし、1 つのエントリを保持する
could not find driver PDOより PDO_SQLSRV は読み込まれていないか、PDO がその後に読み込まれる php --ri pdo_sqlsrvを確認して、PDOの後にPDO_SQLSRVのエントリーを移動させてください
CLIは動作しますが、ウェブリクエストは失敗します 異なる SAPI 構成、または再起動されていないプロセス CLIと phpinfo() 設定値を比較し、ウェブ設定を編集し、ウェブプロセスを再起動します
アップグレード後も旧ExtensionVerが残る 構成では古いバージョン付きファイルが指定されている 選択した方法でインストールされたファイルに古いエントリを入れ替え、重複を削除し、すべてのPHPプロセスを再起動します

拡張機能の検出と読み込み順序はPHPが管理します。 PIE または手動コピーで拡張ファイルが提供されています。 オペレーティングシステムのローダーはネイティブ依存関係を解決します。 拡張機能が読み込まれた後、Microsoft ODBC Driver はデータベース プロトコルを所有します。