Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Använd den här artikeln för att installera SQLSRV och PDO_SQLSRV drivrutiner för PHP på Windows. Drivrutinerna är PHP-tillägg som använder Microsoft ODBC-drivrutinen för SQL Server.
Innan du börjar, kontrollera att din PHP-version, arkitektur och trådsäkerhetsläge stöds i supportmatrisen. PHP-runtimen som används av en kommandoradsprocess och runtimen som används av en webbserver kan använda olika php.ini filer. Konfigurera och verifiera varje runtime separat.
I slutet av proceduren ska både sqlsrv_connect() och PDO-drivrutinen sqlsrv vara tillgängliga för den avsedda CLI:n eller webbapplikationen, och varje API ska slutföra en testfråga mot databasen. En lyckad filkopia i sig är inte en fullständig installation.
Välj en installationsmetod
| Method | Använd den när | Vad den installerar |
|---|---|---|
| PHP-installationsprogram för tillägg (PIE) | Du vill att installationsprogrammet ska välja drivrutinsversionen för den körbara PHP-filen | Utan versionshantering php_sqlsrv.dll och php_pdo_sqlsrv.dll, med försök till automatisk konfiguration |
| Publicerat ZIP-paket | Du måste själv välja, inspektera eller driftsätta exakt förbyggda filer | Versionserade DLL:er valda efter PHP-minorversion, trådsäkerhetsläge och arkitektur |
Använd en metod för båda tilläggen. Håll inte PIE- och ZIP-konfigurationsposter aktiva samtidigt.
Installera nödvändiga förutsättningar
Installera en stödd PHP-build från PHP for Windows-sidan. Lägg till PHP-katalogen i
PATH.Installera den Visual C++ Redistributable som krävs av din PHP-version. Anpassa dess x64- eller x86-arkitektur till PHP, som beskrivs i kraven för PHP för Windows.
Installera den senaste Microsoft ODBC-drivrutinen för SQL Server.
Kör följande kommandon för att kontrollera PHP-runtime och konfigurationsfilen:
php --version php --iniOm Loaded Configuration File är
(none), kopieraphp.ini-developmenttillphp.inii PHP-katalogen.I
php.ini-filen, ställ in tilläggskatalogen och aktivera de tillägg som krävs av PHP Installer for Extensions (PIE):extension_dir = "ext" extension=openssl extension=zipBekräfta att PHP kan hitta de nödvändiga tilläggen:
php --ri openssl php --ri zipÅtgärda dessa förutsättningar innan du laddar ner PIE.
Installera med PIE
PIE installerar det matchande förkompilerade tillägget för PHP-runtime. Det kräver ingen C-kompilator på Windows.
Byt till en katalog du har skrivbehörighet till, och ladda ner det senaste PIE PHP-arkivet (PHAR):
curl.exe -fL --output pie.phar https://github.com/php/pie/releases/latest/download/pie.pharDe återstående PIE-kommandona hänvisar till filen som
.\pie.phar, så kör dem från samma katalog.Innan du kör PHAR, verifiera det med GitHub:s kommandoradsgränssnitt (CLI):
gh attestation verify --owner php .\pie.pharBekräfta nedladdningen innan du fortsätter:
dir pie.phar php .\pie.phar --versionInstallera varje drivrutin separat:
php .\pie.phar install microsoft/sqlsrv php .\pie.phar install microsoft/pdo_sqlsrvVerifiera kommandoradens körningsmiljö:
php --ri sqlsrv php --ri pdo_sqlsrv php -m | findstr /I "sqlsrv pdo_sqlsrv"
PIE försöker aktivera tilläggen i konfigurationen som används av kommandoradskörbaren. Om PIE rapporterar att de inte kunde aktivera ett tillägg, lägg till de PIE-specifika tilläggsposterna.
Om din webbserver använder en annan PHP-installation, installera båda tilläggen för den installationens PHP-version, arkitektur och trådsäkerhetsläge innan du konfigurerar den. Om samma PHP-installation använder en annan php.ini för webbservern, aktivera de installerade drivrutinerna i den filen. Verifiera webbkörningsmiljön separat och starta om webbservern efter att ha ändrat dess konfiguration.
PIE ändrar den valda PHP-installationen. Den konfigurerar inte IIS, väljer inte en IIS-webbplats eller startar om befintliga PHP-processer.
Installera manuellt ett utgivet ZIP-paket
Använd denna metod när du behöver välja drivrutinsfilerna själv eller när PIE inte är lämpligt.
Ladda ner Windows ZIP för den släppta drivrutinsversionen från sidan Microsoft Drivers for PHP for SQL Server releases.
Kör
php -i | findstr /I "PHP Version Thread Safety Architecture extension_dir"och notera PHP-versionen, trådsäkerhetsläget, arkitekturen och tilläggskatalogen.Från ZIP-filen, kopiera båda matchande dynamiska länkbibliotek (DLL) till tilläggskatalogen:
php_sqlsrv_<php-version>_<ts-or-nts>_<x86-or-x64>.dll php_pdo_sqlsrv_<php-version>_<ts-or-nts>_<x86-or-x64>.dllTill exempel använder en PHP 8.5 x64 trådsäker runtime
php_sqlsrv_85_ts_x64.dllochphp_pdo_sqlsrv_85_ts_x64.dll.Lägg till matchande tilläggsnamn till det
php.inisom används av runtime:extension=php_sqlsrv_85_ts_x64.dll extension=php_pdo_sqlsrv_85_ts_x64.dllErsätt
85,ts, ochx64med värdena för din PHP-runtime. Blanda inte trådsäkra och icke-trådsäkra filer, 32-bitars och 64-bitarsfiler, eller filer som är byggda för en annan PHP-minorversion.Verifiera körtiden med
php --ri sqlsrv,php --ri pdo_sqlsrv, ochphp -m. För en webbserver, begränsa åtkomsten till diagnostiska sidor innan du skapar en tillfälligphpinfo()sida. Kontrollera den laddade konfigurationsfilen och båda drivrutinssektionerna, ta sedan bort sidan.
Konfigurera en webbserver
För IIS, konfigurera den avsedda php-cgi.exe-komponenten som ett FastCGI-program genom att följa installationsanvisningarna för PHP på IIS. Bekräfta att FastCGI-applikationen använder samma PHP-katalog och arkitektur som du använde för att installera drivrutinerna.
För alla Windows-webbservrar:
Begränsa åtkomsten till den diagnostiska sidan innan du skapar en tillfällig
phpinfo()sida. Identifiera webbserverns PHP-exekverbara fil och den aktivaphp.ini.Se till att båda drivrutinerna är installerade för webbkörmiljön. För en separat PHP-installation, använd PIE med den installationens PHP-exekverbara fil, eller kopiera båda matchande DLL-filerna från den släppta ZIP-filen till dess tilläggskatalog. Lägg till drivrutinsposterna i webbruntimens konfiguration, även när endast dess
php.iniskiljer sig från CLI:ns.Starta om webbservern eller FastCGI-processerna.
Bekräfta att sidan innehåller separata
sqlsrv- ochpdo_sqlsrv-sektioner.Ta bort
phpinfo()sidan.
Testa båda PHP-API:erna
Spara detta program som verify-php-drivers.php:
<?php
$failures = [];
if (!extension_loaded('sqlsrv') || !function_exists('sqlsrv_connect')) {
$failures[] = 'SQLSRV is not available.';
}
if (!extension_loaded('pdo_sqlsrv') || !in_array('sqlsrv', PDO::getAvailableDrivers(), true)) {
$failures[] = 'PDO_SQLSRV is not available.';
}
echo $failures === []
? "SQLSRV and PDO_SQLSRV are available." . PHP_EOL
: implode(PHP_EOL, $failures) . PHP_EOL;
exit($failures === [] ? 0 : 1);
Kör det först från kommandoraden:
php verify-php-drivers.php
Förväntat resultat:
SQLSRV and PDO_SQLSRV are available.
Om du behöver verifiera en webbruntime, placera filen tillfälligt i webbplatsens dokumentrot och öppna den i en webbläsare. Ta bort den efter testning. Detta program verifierar PHP-API:erna utan att kräva eller exponera databasautentiseringsuppgifter.
Testa en databasanslutning
Inläsning av tillägg är bara den första kontrollen vid installationen. Testa båda API:erna mot databasmålet som applikationen använder, så testet täcker även ODBC-drivrutinen, nätverksväg, kryptering, autentisering, frågeexekvering, returnerade värden och rensning.
Sätt temporära miljövariabler i PowerShell genom att svara på prompter. Ange server- och databasnamn som råvärden, utan citattecken eller drivrutinskodning. Använd inloggningsdialogen eller prompten för ett testkonto som kan ansluta till databasen. Inkludera inte inloggningsuppgifter i en kommandorad eller inspelad terminalsession:
$env:SQL_SERVER_NAME = Read-Host "Server name (tcp:<server>,1433)"
$env:SQL_DATABASE = Read-Host "Database name"
$credential = Get-Credential -Message "Enter the database test account"
if ($null -eq $credential) {
throw "Database test credentials are required."
}
$env:SQL_UID = $credential.UserName
$env:SQL_PWD = $credential.GetNetworkCredential().Password
Remove-Variable credential
Inloggningsuppmaningen döljer lösenordet. Miljön innehåller klartextlösenordet så att PHP kan läsa det. Använd dessa variabler endast under testsessionen, skriv inte ut dem, och rensa dem efter testning.
Spara detta program som test-php-drivers.php. Behåll miljövariablerna oförändrade. Programmet dubblar avslutande klammerparenteser och lägger till yttre klammer innan programmet skickar databasnamnet, användarnamnet och lösenordet vidare till drivrutinen. Denna kodning bevarar bokstavliga klamrar och förhindrar semikolon från att separera anslutningsalternativ.
<?php
$serverName = getenv('SQL_SERVER_NAME');
$database = getenv('SQL_DATABASE');
$uid = getenv('SQL_UID');
$pwd = getenv('SQL_PWD');
if ($serverName === false || $serverName === ''
|| $database === false || $database === ''
|| $uid === false || $uid === ''
|| $pwd === false || $pwd === '') {
fwrite(STDERR, "Set SQL_SERVER_NAME, SQL_DATABASE, SQL_UID, and SQL_PWD." . PHP_EOL);
exit(1);
}
$database = '{' . str_replace('}', '}}', $database) . '}';
$uid = '{' . str_replace('}', '}}', $uid) . '}';
$pwd = '{' . str_replace('}', '}}', $pwd) . '}';
$connectionOptions = [
"Database" => $database,
"UID" => $uid,
"PWD" => $pwd,
"Encrypt" => 1,
"TrustServerCertificate" => 0,
];
$sqlsrvConnection = sqlsrv_connect($serverName, $connectionOptions);
if ($sqlsrvConnection === false) {
foreach (sqlsrv_errors() as $error) {
fwrite(
STDERR,
"SQLSRV {$error['SQLSTATE']} ({$error['code']}): {$error['message']}" . PHP_EOL
);
}
exit(1);
}
$sqlsrvStatement = sqlsrv_query($sqlsrvConnection, "SELECT 1 AS TEST_VALUE");
if ($sqlsrvStatement === false) {
foreach (sqlsrv_errors() as $error) {
fwrite(
STDERR,
"SQLSRV {$error['SQLSTATE']} ({$error['code']}): {$error['message']}" . PHP_EOL
);
}
sqlsrv_close($sqlsrvConnection);
exit(1);
}
$sqlsrvRow = sqlsrv_fetch_array($sqlsrvStatement, SQLSRV_FETCH_ASSOC);
if ($sqlsrvRow === false || $sqlsrvRow === null || (int) $sqlsrvRow['TEST_VALUE'] !== 1) {
fwrite(STDERR, "SQLSRV returned an unexpected result." . PHP_EOL);
sqlsrv_free_stmt($sqlsrvStatement);
sqlsrv_close($sqlsrvConnection);
exit(1);
}
echo "SQLSRV query: 1" . PHP_EOL;
sqlsrv_free_stmt($sqlsrvStatement);
sqlsrv_close($sqlsrvConnection);
$failed = false;
try {
$pdoConnection = new PDO(
"sqlsrv:server=$serverName;Database=$database;Encrypt=1;TrustServerCertificate=0",
$uid,
$pwd,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
$pdoStatement = $pdoConnection->query("SELECT 1 AS TEST_VALUE");
$pdoRow = $pdoStatement->fetch(PDO::FETCH_ASSOC);
if ($pdoRow === false || (int) $pdoRow['TEST_VALUE'] !== 1) {
throw new RuntimeException("PDO_SQLSRV returned an unexpected result.");
}
echo "PDO_SQLSRV query: 1" . PHP_EOL;
} catch (Throwable $exception) {
fwrite(STDERR, $exception->getMessage() . PHP_EOL);
$failed = true;
} finally {
unset($pdoStatement);
unset($pdoConnection);
}
exit($failed ? 1 : 0);
Kör programmet med samma PHP-exekverbara fil som du verifierade:
php test-php-drivers.php
Förväntat resultat:
SQLSRV query: 1
PDO_SQLSRV query: 1
Om tilläggskontrollen klaras men detta program misslyckas, använd SQLSTATE och den inbyggda felkoden för att identifiera det ägande lagret. Installera inte om PHP-tilläggen vid nätverks-, certifikat-, autentiserings- eller databasbehörighetsfel.
Ta bort skriptet och temporära variabler efter test:
Remove-Item .\verify-php-drivers.php, .\test-php-drivers.php
Remove-Item Env:\SQL_SERVER_NAME, Env:\SQL_DATABASE, Env:\SQL_UID, Env:\SQL_PWD
Troubleshooting
| Symtom | Vad du bör kontrollera | Reparera |
|---|---|---|
Could not open input file: .\pie.phar |
Nuvarande mapp och nedladdningsplats | Gå tillbaka till katalogen som innehåller den verifierade PHAR, eller ladda ner och verifiera den igen |
Unable to load dynamic library |
extension_dir, exakt DLL-namn, PHP-minorversion, arkitektur och trådsäkerhetsläge |
Välj den matchande DLL:n eller kör om PIE med den avsedda PHP-exekverbara filen |
The specified module could not be found |
Drivrutins-DLL-beroenden | Bekräfta att tillägget DLL finns, installera den matchande Visual C++ Redistributable, och inspektera eventuellt kvarvarande saknat DLL-beroende |
| CLI laddar båda drivrutinerna men IIS gör det inte | Annan PHP-exekverbar fil eller php.ini |
Jämför php --ini med phpinfo(), konfigurera IIS-runtimen och starta om FastCGI |
Module "sqlsrv" is already loaded |
Både PIE- och ZIP-poster, eller upprepade poster | Behåll en SQLSRV-post och en PDO_SQLSRV post |
PDO-rapporter could not find driver |
PDO_SQLSRV konfiguration | Kör php --ri pdo_sqlsrv och kontrollera PDO::getAvailableDrivers() |
| PIE rapporterar framgång men en gammal version finns kvar | Versionshanterade ZIP-posterna är fortfarande aktiva | Byt ut gamla poster mot PIE:s oversionerade DLL-poster och starta om varje PHP-process |
Om båda tilläggen laddas kan PHP anropa deras API:er. Fånga SQLSRV-fel eller ett PDO-undantag innan du ändrar drivrutinsfiler. Fel i nätverk, autentisering, kryptering, certifikat och databasbehörigheter åtgärdas inte genom att installera om PHP-tillägget.