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ドライバーがデータベースプロトコルを制御します。