Laad de Microsoft-drivers voor PHP voor SQL Server

De SQLSRV- en PDO_SQLSRV-drivers zijn PHP-extensies. PHP laadt ze wanneer het PHP-proces begint door het lezen php.ini en eventuele extra .ini bestanden.

Het laden is gescheiden van de installatie. Het kopiëren of bouwen van de extensie plaatst een bestand op de schijf. PHP kan SQLSRV of PDO_SQLSRV niet gebruiken totdat de actieve configuratie de juiste invoer bevat en het PHP-proces opnieuw wordt opgestart.

Bescherm webdiagnostische pagina's

Voordat je een tijdelijke phpinfo() pagina aanmaakt, configureer je de webserver zodat alleen localhost-verzoeken of geauthenticeerde beheerders worden toegestaan. Houd die beperking aan totdat je de pagina verwijdert. phpinfo() kan omgevingsvariabelen, inloggegevens en serverconfiguratie blootstellen. Verwijder de pagina direct na verificatie.

Begrijp de PHP-configuratiescope

Elke PHP-server application programming interface (SAPI) kan een ander uitvoerbaar bestand en configuratie gebruiken:

Runtime Standaardconfiguratiebron Hoe je het identificeert
Opdrachtregelinterface (Command-line Interface, CLI) De php.ini en scandirectory gerapporteerd door php --ini Voer php --ini uit met het exacte uitvoerbare bestand
IIS FastCGI Het in de IIS FastCGI-applicatie geconfigureerde PHP-uitvoerbare bestand Gebruik een tijdelijke phpinfo() pagina
Apache-module Apache's PHP-moduleconfiguratie Gebruik een tijdelijke phpinfo() pagina
PHP-FPM Het FPM-uitvoerbare bestand, pool, php.ini, en scandirectory Voer de geversioneerde FPM-binary uit met -i of gebruik een tijdelijke phpinfo() pagina
Langdurige worker Het uitvoerbare bestand en de omgeving die de worker hebben gestart Controleer de worker service en start hem opnieuw na de wijzigingen.

Het wijzigen van de CLI-configuratie verandert IIS, Apache of PHP-FPM niet wanneer ze een andere PHP-installatie of scandirectory gebruiken.

Zoek de PHP-configuratie

Voer deze commando's uit met het PHP-uitvoerbare bestand dat door je applicatie wordt gebruikt:

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

Op Linux of macOS, vervang findstr door grep:

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

Het file commando identificeert de architectuur van het geselecteerde uitvoerbare bestand. Volg voor een universeel uitvoerbaar macOS-bestand de instructies voor expliciete architectuurselectie.

De waarden van Loaded Configuration File en Scan for additional .ini files in geven de configuratie aan die door het commandoregelproces wordt gebruikt. Een webserver of PHP FastCGI Process Manager (PHP-FPM) proces kan een ander PHP-uitvoerbaar bestand of configuratiebestand gebruiken. Gebruik een tijdelijke phpinfo() pagina om de waarden van dat proces te identificeren.

Voordat je een bestand bewerkt, noteer je:

  • Het pad naar het PHP-uitvoerbare bestand en de versie.
  • Het geladen php.ini.
  • De extra .ini scanmap.
  • De extensiemap.
  • De thread-safety-modus en architectuur.
  • Elk proces dat je opnieuw moet starten.

Maak een back-up van elk configuratiebestand dat je verandert.

Drivers laden in Windows

Voor een installatie met de PHP Installer for Extensions (PIE), download en verifieer je eerst PIE. Voer de volgende commando's uit vanuit de map die pie.phar bevat, met het uitvoerbare bestand PHP dat de drivers zou moeten laden:

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

PIE installeert php_sqlsrv.dll en php_pdo_sqlsrv.dll. Als PIE de extensies niet automatisch kan inschakelen, verwijder dan bestaande SQLSRV- en PDO_SQLSRV-vermeldingen uit de actieve php.ini, voeg dan het volgende toe:

extension=php_sqlsrv.dll
extension=php_pdo_sqlsrv.dll

Gebruik slechts één vermelding per stuurprogramma. Start het PHP-proces opnieuw nadat je de configuratie hebt gewijzigd.

Voor een ZIP-installatie kopieer je de dynamic-link libraries (DLL's) die overeenkomen met de PHP minor versie, architectuur en thread-safety-modus naar de extension_dir directory. Een PHP 8.5 x64 thread-safe runtime gebruikt deze bestandsnamen:

php_sqlsrv_85_ts_x64.dll
php_pdo_sqlsrv_85_ts_x64.dll

Voeg beide bestandsnamen toe aan de php.ini die door het PHP-proces wordt gebruikt:

extension=php_sqlsrv_85_ts_x64.dll
extension=php_pdo_sqlsrv_85_ts_x64.dll

Vervang 85, ts, en x64 door de waarden voor je PHP-runtime. Meng geen thread-veilige en niet-threadveilige bestanden, 32-bit en 64-bit bestanden, of bestanden die voor een andere PHP-minor versie zijn gemaakt.

Laad de drivers op Linux en macOS

Installeer de drivers met PIE. Voor meer informatie, zie de Linux- en macOS-installatietutorial. PIE installeert de extensiebestanden en probeert deze in te schakelen met behulp van de PHP-configuratietools van het platform of door een extension= entry toe te voegen aan een extra .ini bestand of de standaard php.ini. Als PIE meldt dat het geen extensie kon inschakelen, voeg dan zelf de invoer toe en verifieer de actieve configuratie.

Voor een handmatige installatie selecteer je de vooraf gebouwde .so bestanden die passen bij je PHP-versie, architectuur, thread-safety-modus en de native bibliotheken van het besturingssysteem. Controleer de vooraf gebouwde Linux- en macOS-vereisten; gebruik PIE als ze niet overeenkomen met je omgeving.

Bijvoorbeeld heten PHP 8.4 niet-thread-safe-bestanden SQLSRV_8.4_NTS.so en PDO_SQLSRV_8.4_NTS.so. Plaats ze in de map die door php -i | grep extension_dir wordt geretourneerd. Hernoem ze naar sqlsrv.so en pdo_sqlsrv.so om de volgende items te gebruiken, of gebruik in plaats daarvan exact de pakketbestandsnamen in de items. Voeg de vermeldingen toe aan je actieve PHP-configuratie in de load order die in deze sectie wordt beschreven:

extension=sqlsrv.so
extension=pdo_sqlsrv.so

PHP Data Objects (PDO) moet worden geladen voordat PDO_SQLSRV. PHP leest php.ini voordat er extra .ini bestanden in alfabetische volgorde worden gescand. Als je distributie pdo.so laadt vanuit een gescand bestand, plaats dan de PDO_SQLSRV-invoer in een later gescand bestand, bijvoorbeeld 30-pdo_sqlsrv.ini wanneer PDO 10-pdo.ini gebruikt. Plaats in dat geval de PDO_SQLSRV vermelding php.ini niet.

Kies de extensie-items

Gebruik vermeldingen die overeenkomen met hoe de drivers zijn geïnstalleerd:

Platform en methode SQLSRV-invoer PDO_SQLSRV item
Windows met PIE extension=php_sqlsrv.dll extension=php_pdo_sqlsrv.dll
Door Windows vrijgegeven ZIP Exacte DLL-naam met versienummer, zoals extension=php_sqlsrv_85_ts_x64.dll Exacte DLL-naam met versienummer, zoals extension=php_pdo_sqlsrv_85_ts_x64.dll
Linux of macOS met PIE extension=sqlsrv.so extension=pdo_sqlsrv.so
Archief voor Linux of macOS, bestanden hernoemd extension=sqlsrv.so extension=pdo_sqlsrv.so
Vrijgegeven archief voor Linux of macOS, originele bestanden Exact archiefbestandsnaam, zoals extension=SQLSRV_8.4_NTS.so Exact archiefbestandsnaam, zoals extension=PDO_SQLSRV_8.4_NTS.so

Configureer niet zowel een korte naam als een naam met versienummer voor dezelfde extensie. PHP kan rapporteren dat een module al geladen is, of het kan een ouder bestand na een upgrade blijven laden.

Herstart PHP om de drivers te laden

Herstart het proces na het wijzigen van een extensiebestand of configuratiebestand. Herstart de webserver, PHP-FPM, wachtrijwerkers en andere langlopende PHP-processen die de driver laden.

De SQLSRV- en PDO_SQLSRV-extensies kunnen onafhankelijk geladen worden, maar installeer en verifieer beide wanneer je applicatie beide drivers gebruikt. PDO is ingebouwd in veel PHP-pakketten. Als de PDO niet ingebouwd is, schakel dan de PDO-extensie in vóór PDO_SQLSRV.

Controleer de geladen drivers

Voor de commandoregelruntime, voer uit:

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

Op Linux of macOS, gebruik:

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

Beperk voor een webserver de toegang tot diagnostische pagina's voordat u een tijdelijke pagina aanmaakt met <?php phpinfo(); ?>. Bevestig het geladen configuratiebestand, extension_dir en afzonderlijke sqlsrv- en pdo_sqlsrv-secties. Verwijder de pagina na verificatie.

Doe ook een PHP-niveau controle zodat verificatie beide API's omvat en niet alleen modulenamen. Sla dit programma op 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);

Voer het programma uit met elk PHP-uitvoerbaar bestand dat je applicatie gebruikt:

php verify-php-drivers.php

Verwachte uitvoer:

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

Voor een webruntime plaats je het bestand tijdelijk in de documentroot en vraag je het op in een browser. Verwijder het na verificatie. Dit programma opent geen databaseverbinding en print geen configuratiewaarden.

Verwijder verify-php-drivers.php nadat je de CLI- en webruntime-controles hebt afgerond.

Problemen met het laden van stuurprogramma's oplossen

Symptom Oorzaak om te controleren Corrigerende actie
Unable to load dynamic library Verkeerde bestandsnaam, extension_dir, PHP minor versie, architectuur of thread-safety-modus Vergelijk php -i met het geselecteerde driverbestand en gebruik tijdelijk een absoluut pad om padfouten te isoleren
The specified module could not be found op Windows De driver-DLL of een van zijn afhankelijkheden is niet beschikbaar Controleer dat de DLL in extension_dir zit, installeer de bijbehorende Visual C++ runtime en controleer eventuele overige ontbrekende DLL-afhankelijkheden
undefined symbol of shared-library-fout op Linux of macOS Extensie- en PHP-build-mismatch, of ontbrekende ODBC-afhankelijkheid Herbouw met de bedoelde php-config, en inspecteer vervolgens de gemelde ontbrekende bibliotheek
Module "sqlsrv" is already loaded Dubbele vermeldingen of twee gescande bestanden Zoek in de geladen php.ini en scanmap, en behoud dan één item
could not find driver van PDO PDO_SQLSRV wordt niet geladen, of PDO pas daarna wordt geladen Controleer php --ri pdo_sqlsrv en verplaats de PDO_SQLSRV invoer na PDO
CLI werkt, maar webverzoeken mislukken Andere SAPI-configuratie of een proces dat niet opnieuw is gestart Vergelijk CLI en phpinfo() configuratiewaarden, bewerk de webconfiguratie en herstart het webproces
Oude ExtensionVer blijft na een upgrade staan De configuratie verwijst nog steeds naar een ouder versiebestand Vervang de oude vermelding door het bestand dat door de geselecteerde methode is geïnstalleerd, verwijder duplicaten en start alle PHP-processen opnieuw

PHP beheert extensie-ontdekking en laadvolgorde. PIE of een handmatig gekopieerd bestand levert het extensiebestand. De besturingssysteemloader lost native afhankelijkheden op. De Microsoft ODBC-driver beheert het databaseprotocol nadat de extensie is geladen.