Lade die Microsoft-Treiber für PHP für SQL Server

Die SQLSRV- und PDO_SQLSRV-Treiber sind PHP-Erweiterungen. PHP lädt sie, wenn der PHP-Prozess startet, indem es .ini und alle zusätzlichen php.ini-Dateien liest.

Das Laden ist getrennt von der Installation. Das Kopieren oder Erstellen der Erweiterung legt eine Datei auf die Festplatte. PHP kann SQLSRV oder PDO_SQLSRV nicht verwenden, bis die aktive Konfiguration den richtigen Eintrag enthält und der PHP-Prozess neu gestartet wird.

Webdiagnoseseiten schützen

Bevor Sie eine temporäre phpinfo() Seite erstellen, konfigurieren Sie den Webserver so, dass nur localhost-Anfragen oder authentifizierte Administratoren zugelassen werden. Behalte diese Einschränkung, bis du die Seite löschst. phpinfo() kann Umgebungsvariablen, Zugangsdaten und Serverkonfigurationen offenlegen. Entfernen Sie die Seite sofort nach der Verifizierung.

Den Geltungsbereich der PHP-Konfiguration verstehen

Jede PHP-Server-Anwendungsprogrammierschnittstelle (SAPI) kann eine andere ausführbare Datei und Konfiguration verwenden:

Runtime Typische Konfigurationsquelle Wie man sie identifiziert
Befehlszeilenschnittstelle (CLI) Das von php --ini gemeldete php.ini und Scan-Verzeichnis Ausführen von php --ini genau mit der ausführbaren Datei
IIS FastCGI Die in der IIS-FastCGI-Anwendung konfigurierte PHP-Ausführungsdatei Verwenden Sie eine temporäre phpinfo() Seite
Apache-Modul Konfiguration des PHP-Moduls von Apache Verwenden Sie eine temporäre phpinfo() Seite
PHP-FPM Die FPM-Executable-Datei, der Pool, php.ini und das Scan-Verzeichnis Führe die versionierte FPM-Binärdatei mit -i oder nutze eine temporäre phpinfo() Seite
Zeitintensive Worker Die ausführbare Datei und die Umgebung, mit der der Worker gestartet wurde Überprüfen Sie den Arbeiterservice und starten Sie ihn nach den Änderungen neu

Die Änderung der CLI-Konfiguration wirkt sich nicht auf IIS, Apache oder PHP-FPM aus, wenn sie eine andere PHP-Installation oder ein Scan-Verzeichnis verwenden.

Finde die PHP-Konfiguration

Führe diese Befehle mit der von deiner Anwendung verwendeten PHP-Executable aus:

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

Unter Linux oder macOS ersetzen Sie findstr durch grep:

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

Der file Befehl identifiziert die Architektur der ausgewählten ausführbaren Datei. Für eine universelle ausführbare macOS-Datei befolgen Sie die Anweisungen zur expliziten Architekturauswahl.

Die geladene Konfigurationsdatei und die Werte Nach zusätzlichen .ini-Dateien suchen in identifizieren die vom Kommandozeilenprozess verwendete Konfiguration. Ein Webserver oder ein PHP FastCGI Process Manager (PHP-FPM)-Prozess kann eine andere ausführbare PHP-Datei oder Konfigurationsdatei verwenden. Verwenden Sie eine temporäre phpinfo() Seite, um die Werte dieses Prozesses zu identifizieren.

Bevor du eine Datei bearbeitest, notiere:

  • Der Pfad zur PHP-Ausführungsdatei und die Version.
  • Die geladene php.ini-Datei
  • Das zusätzliche .ini-Überprüfungsverzeichnis
  • Das Erweiterungsverzeichnis.
  • Der Thread-Sicherheitsmodus und die Architektur.
  • Jeder Prozess, den du neu starten musst.

Sichere jede Konfigurationsdatei, die du änderst.

Lade die Treiber unter Windows

Für eine Installation mit dem PHP Installer for Extensions (PIE)laden Sie zuerst PIE herunter und überprüfen Sie es. Führen Sie die folgenden Befehle aus dem Verzeichnis aus, das pie.phar enthält, mit der ausführbaren PHP-Datei, die die Treiber laden soll:

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

PIE installiert php_sqlsrv.dll und php_pdo_sqlsrv.dll. Wenn PIE die Erweiterungen nicht automatisch aktivieren kann, entferne alle vorhandenen SQLSRV- und PDO_SQLSRV-Einträge aus der aktiven php.ini, dann füge hinzu:

extension=php_sqlsrv.dll
extension=php_pdo_sqlsrv.dll

Verwenden Sie nur einen Eintrag pro Treiber. Starte den PHP-Prozess nach der Änderung der Konfiguration neu.

Für eine ZIP-Installation kopieren Sie die dynamischen Link-Bibliotheken (DLLs), die zur PHP-Minor-Version, Architektur und zum Thread-Sicherheitsmodus passen, in das extension_dir Verzeichnis. Eine PHP 8.5 x64-threadsichere Laufzeitumgebung verwendet folgende Dateinamen:

php_sqlsrv_85_ts_x64.dll
php_pdo_sqlsrv_85_ts_x64.dll

Fügen Sie beide Dateinamen zu dem vom PHP-Prozess verwendeten php.ini hinzu:

extension=php_sqlsrv_85_ts_x64.dll
extension=php_pdo_sqlsrv_85_ts_x64.dll

Ersetzen Sie 85, ts, und x64 durch die Werte für Ihre PHP-Laufzeit. Mische keine threadsicheren und nicht-threadsicheren Dateien, 32-Bit- und 64-Bit-Dateien oder Dateien, die für eine andere PHP-Minor-Version erstellt wurden.

Lade die Treiber unter Linux und macOS

Installiere die Treiber über PIE. Weitere Informationen finden Sie im Linux- und macOS-Installationstutorial. PIE installiert die Erweiterungsdateien und versucht, sie mithilfe der PHP-Konfigurationstools der Plattform zu aktivieren oder einen extension=-Eintrag zu einer zusätzlichen .ini-Datei oder zur php.ini-Standarddatei hinzuzufügen. Wenn PIE meldet, dass PIE eine Erweiterung nicht aktivieren konnte, füge den Eintrag selbst hinzu und verifiziere die aktive Konfiguration.

Für eine manuelle Installation wählen Sie die vorgefertigten .so Dateien aus, die zu Ihrer PHP-Version, Architektur, dem Thread-Sicherheitsmodus und den nativen Betriebssystembibliotheken passen. Überprüfe die vorgefertigten Linux- und macOS-Voraussetzungen; benutze PIE, wenn sie nicht zu deiner Umgebung passen.

Zum Beispiel werden nicht threadsichere PHP 8.4-Dateien als SQLSRV_8.4_NTS.so und PDO_SQLSRV_8.4_NTS.so bezeichnet. Legen Sie sie in dem Verzeichnis ab, das von php -i | grep extension_dir zurückgegeben wird. Benennen Sie sie in sqlsrv.so und pdo_sqlsrv.so um, um die folgenden Einträge zu verwenden, oder verwenden Sie stattdessen die genauen Paketdateinamen in den Einträgen. Füge die Einträge deiner aktiven PHP-Konfiguration in der in diesem Abschnitt beschriebenen Load Order hinzu:

extension=sqlsrv.so
extension=pdo_sqlsrv.so

PHP-Datenobjekte (PDO) müssen vor PDO_SQLSRV geladen werden. PHP liest php.ini vor dem Scannen weiterer .ini Dateien in alphabetischer Reihenfolge. Wenn deine Distribution pdo.so aus einer gescannten Datei lädt, platziere den PDO_SQLSRV-Eintrag in einer später gescannten Datei, zum Beispiel 30-pdo_sqlsrv.ini, wenn PDO 10-pdo.ini verwendet. Platziere in diesem Fall nicht den PDO_SQLSRV-Eintrag php.ini .

Wählen Sie die Erweiterungseinträge

Verwenden Sie Einträge, die der Art der Treiberinstallation entsprechen:

Plattform und Methode SQLSRV-Eintrag PDO_SQLSRV Eintrag
Windows mit PIE extension=php_sqlsrv.dll extension=php_pdo_sqlsrv.dll
Von Windows veröffentlichte ZIP Exakt versionierter DLL-Name, wie zum Beispiel extension=php_sqlsrv_85_ts_x64.dll Exakt versionierter DLL-Name, wie zum Beispiel extension=php_pdo_sqlsrv_85_ts_x64.dll
Linux oder macOS mit PIE extension=sqlsrv.so extension=pdo_sqlsrv.so
Von Linux oder macOS freigegebenes Archiv, umbenannte Dateien extension=sqlsrv.so extension=pdo_sqlsrv.so
Von Linux oder macOS freigegebenes Archiv, Originaldateien Exakter Archivdateiname, wie zum Beispiel extension=SQLSRV_8.4_NTS.so Exakter Archivdateiname, wie zum Beispiel extension=PDO_SQLSRV_8.4_NTS.so

Konfigurieren Sie nicht sowohl einen Kurznamen als auch einen versionierten Namen für dieselbe Erweiterung. PHP kann melden, dass ein Modul bereits geladen ist, oder es kann nach einem Upgrade eine ältere Datei weiter laden.

Starte PHP neu, um die Treiber zu laden

Starten Sie den Prozess neu, nachdem Sie eine Erweiterungs- oder Konfigurationsdatei geändert haben. Starten Sie den Webserver, PHP-FPM, Queue-Worker und andere langlaufende PHP-Prozesse, die den Treiber laden, neu.

Die SQLSRV- und PDO_SQLSRV-Erweiterungen können unabhängig voneinander geladen werden, installieren und überprüfen Sie jedoch beide, wenn Ihre Anwendung beide Treiber verwendet. PDO ist in vielen PHP-Paketen integriert. Wenn ein PDO nicht eingebaut ist, aktiviere die PDO-Erweiterung vor PDO_SQLSRV.

Überprüfe die geladenen Treiber

Für die Kommandozeilenlaufzeit führen Sie aus:

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

Unter Linux oder macOS verwenden Sie:

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

Für einen Webserver sollte der Zugriff auf die diagnostische Seite eingeschränkt werden, bevor eine temporäre Seite erstellt wird, die <?php phpinfo(); ?> enthält. Bestätigen Sie die geladene Konfigurationsdatei, extension_dir sowie die separaten Abschnitte sqlsrv und pdo_sqlsrv. Entfernen Sie die Seite nach der Verifizierung.

Führe auch eine PHP-Prüfung durch, damit die Verifizierung beide APIs abdeckt und nicht nur Modulnamen. Speichere dieses Programm als 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);

Führe das Programm mit jedem PHP-Executable aus, das deine Anwendung verwendet:

php verify-php-drivers.php

Erwartete Ausgabe:

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

Für eine Web-Runtime legt man die Datei vorübergehend im Document-Root ab und fordert sie in einem Browser an. Entfernen Sie es nach der Überprüfung. Dieses Programm öffnet keine Datenbankverbindung und druckt keine Konfigurationswerte aus.

Löschen Sie verify-php-drivers.php, nachdem Sie die CLI- und Web-Runtime-Prüfungen abgeschlossen haben.

Probleme beim Laden von Treibern beheben

Symptom Zu prüfende Ursache Korrekturmaßnahme
Unable to load dynamic library Falscher Dateiname, extension_dir, PHP-Nebenversion, Architektur oder Thread-Sicherheitsmodus Vergleichen Sie php -i mit der ausgewählten Treiberdatei und verwenden Sie vorübergehend einen absoluten Pfad, um Pfadfehler zu isolieren
The specified module could not be found unter Windows Die Treiber-DLL oder eine ihrer Abhängigkeiten ist nicht verfügbar Bestätigen Sie, dass sich die DLL in extension_dir befindet, installieren Sie die passende Visual C++-Laufzeit und überprüfen Sie alle verbleibenden fehlenden DLL-Abhängigkeiten
undefined symbol oder Shared-Library-Fehler unter Linux oder macOS Erweiterungs- und PHP-Build-Mismatch oder fehlende ODBC-Abhängigkeit Bauen Sie mit der vorgesehenen php-config neu auf und inspizieren Sie dann die gemeldete fehlende Bibliothek
Module "sqlsrv" is already loaded Doppelte Einträge oder zwei gescannte Dateien Die geladene Datei php.ini suchen und das Verzeichnis scannen, dann einen Eintrag behalten
could not find driver von PDO PDO_SQLSRV ist nicht geladen oder PDO wird danach geladen Überprüfe php --ri pdo_sqlsrv und verschiebe den PDO_SQLSRV Eintrag nach PDO
CLI funktioniert, aber Web-Anfragen scheitern Andere SAPI-Konfiguration oder ein Prozess, der nicht neu gestartet wurde Vergleichen Sie CLI und phpinfo() Konfigurationswerte, bearbeiten Sie die Webkonfiguration und starten Sie den Webprozess neu
Die alte ExtensionVer bleibt nach einem Upgrade bestehen. Die Konfiguration nennt immer noch eine ältere versionierte Datei Ersetzen Sie den alten Eintrag durch die mit der gewählte Methode installierte Datei, entfernen Sie Duplikate und starten Sie alle PHP-Prozesse neu

PHP steuert die Erkennung und Ladereihenfolge der Erweiterungen. PIE oder eine manuelle Kopie stellt die Erweiterungsdatei bereit. Das Betriebssystemladeprogramm löst native Abhängigkeiten auf. Der Microsoft ODBC-Treiber übernimmt das Datenbankprotokoll nach dem Laden der Erweiterung.