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.
Microsoft-drivrutinerna för PHP för SQL Server är PHP-tillägg som låter dig läsa och skriva data i Microsoft SQL Database Engine från PHP-skript. Paketet innehåller två drivrutiner som omsluter samma Microsoft ODBC-drivrutin för SQL Server och delar samma anslutningsalternativ, så du kan välja det API som passar din kodbas:
-
SQLSRV exponerar ett prozedurmässigt API (
sqlsrv_*funktioner) anpassat till SQL Server-funktioner. - PDO_SQLSRV implementerar PHP Data Objects (PDO)-gränssnittet, så kod som redan använder PDO för andra databaser kan rikta in sig på SQL Server med minimala ändringar.
Båda drivrutinerna ansluter till Azure SQL Database, SQL-databas i Microsoft Fabric, Azure SQL Managed Instance och alla stödda versioner och utgåvor av SQL Server (inklusive Express-versioner). De använder PHP-strömmar för att flytta stora binär- och teckenvärden utan att ladda in dem helt i minnet.
Välj startpunkt
| Mål | Börja här |
|---|---|
| Sätt upp en PHP-utvecklingsmiljö och kör din första fråga | Steg 1: Konfigurera utvecklingsmiljön, sedan Steg 2: Skapa en SQL-databas och Steg 3: Bevis på koncept som ansluter till SQL med PHP. |
| Installera drivrutinen på Linux eller macOS | Installationsguide för Linux och macOS och ladda ner Microsoft-drivrutinerna för PHP för SQL Server. |
| Connect to Azure SQL med lösenordslös autentisering | Koppla upp dig med Microsoft Entra-autentisering och anslutningsalternativ. |
| Gör en befintlig app motståndskraftig mot tillfälliga fel | Vilolägesanslutningsresiliens och steg 4: Koppla upp sig robust mot SQL med PHP. |
| Bestäm dig mellan SQLSRV och PDO_SQLSRV | Översikt över Microsoft-drivrutinerna för PHP för SQL Server och jämförelse av exekveringsfunktioner. |
| Diagnostisera ett installations-, anslutnings- eller frågeproblem | Felsökning, hanteringsfel och varningar samt loggningsaktivitet. |
| Gör en befintlig app snabbare | Prestandajustering. |
Snabbanslutning
Följande utdrag är den kortaste end-to-end-anslutningen som en fungerande PHP-installation kan köra mot SQL Server eller Azure SQL. Använd den för att bekräfta att din drivrutin, ODBC-beroenden och nätverksbana är kopplade innan du går vidare till produktionsbaslinjen i nästa avsnitt.
<?php
$server = getenv('SQL_SERVER') ?: 'localhost';
$database = getenv('SQL_DATABASE') ?: 'master';
$user = getenv('SQL_USER');
$password = getenv('SQL_PASSWORD');
$dsn = "sqlsrv:Driver={ODBC Driver 18 for SQL Server};Server=$server;Database=$database;Encrypt=true";
$pdo = new PDO($dsn, $user, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
foreach ($pdo->query('SELECT @@VERSION AS version') as $row) {
echo $row['version'], PHP_EOL;
}
För en lösenordslös anslutning mot Azure SQL, lägg till Authentication=ActiveDirectoryMsi (managed identity) eller ett annat Authentication värde i DSN och ta bort argumenten/$user$password. Produktionsbaslinjen som följer följer samma mönster med omförsök, timeouts och diagnostik.
För en lokal SQL Server som använder ett självsignerat certifikat Encrypt=true misslyckas valideringen. Lägg till för TrustServerCertificate=true lokal utveckling enbart. Se TLS-certifikatfel för produktionsalternativen.
Produktionsbaslinje för Azure SQL
Använd detta utdrag som utgångspunkt för en produktionsorienterad Azure SQL-koppling till den PDO_SQLSRV drivrutinen. Den läser servern och databasen från miljövariabler (till exempel Azure App Service-appinställningar), autentiserar med en hanterad identitet, aktiverar Transport Layer Security (TLS) med validering av servercertifikat, sätter en inloggningstidsgräns som täcker en kallstartsfailover, och sätter ConnectRetryCount och ConnectRetryInterval för SQL Server inaktiva anslutningsresiliens. Applikationsnivån connectWithRetry och queryWithRetry hjälpsystemen omsluter både den initiala anslutningen och varje sats med en begränsad exponentiell backoff, och separationer mellan tillfälliga anslutningsfel (som kräver en ny anslutning) och tillfälliga frågefel (som återanvänder samma anslutning).
Kräver PHP 8.0 och senare versioner, PDO_SQLSRV-tillägget och Microsoft ODBC-drivrutin för SQL Server 17.3.1.1 och senare versioner för Authentication=ActiveDirectoryMsi. För hela listan över stödda Authentication värden, se Connect using Microsoft Entra authentication.
<?php
declare(strict_types=1);
// Transient errors that require a fresh connection to recover. SQLSTATE values
// starting with '08' cover ODBC connection-established and connection-broken
// states (for example, 08001, 08S01).
const CONNECT_RETRY_SQLSTATE_PREFIX = '08';
// SQL Server error codes that are transient regardless of when they surface:
// 1205 (deadlock victim), 1222 (lock request timeout), and the Azure SQL
// throttling, mid-query failover, and "database not currently available"
// codes that arrive with SQLSTATE HY000.
const TRANSIENT_SERVER_ERROR_CODES = [1205, 1222, 40501, 40613, 40197, 10928, 10929, 49918];
/**
* Open a connection, retrying transient failures with exponential backoff.
*/
function connectWithRetry(string $dsn, array $options, int $maxAttempts = 3): PDO
{
for ($attempt = 1; $attempt <= $maxAttempts; $attempt++) {
try {
$pdo = new PDO($dsn, null, null, $options);
error_log(sprintf('connected on attempt %d/%d', $attempt, $maxAttempts));
return $pdo;
} catch (PDOException $e) {
$sqlstate = (string) $e->getCode();
$driverCode = isset($e->errorInfo[1]) ? (int) $e->errorInfo[1] : 0;
$isTransient = str_starts_with($sqlstate, CONNECT_RETRY_SQLSTATE_PREFIX)
|| in_array($driverCode, TRANSIENT_SERVER_ERROR_CODES, true);
if (!$isTransient || $attempt === $maxAttempts) {
error_log(sprintf('connect failed on attempt %d/%d: %s', $attempt, $maxAttempts, $e->getMessage()));
throw $e;
}
$delay = 2 ** ($attempt - 1); // 1, 2, 4 seconds
error_log(sprintf('connect attempt %d hit transient %s/%d; retrying in %d seconds', $attempt, $sqlstate, $driverCode, $delay));
sleep($delay);
}
}
throw new RuntimeException('connectWithRetry exhausted retries');
}
/**
* Run a parameterized query, retrying transient statement failures on the same
* connection. Deadlocks (1205) roll back the transaction before the driver sees
* the error, so rerunning a single statement is safe. If the statement was part
* of a multistatement transaction, wrap the whole transaction in your own retry
* loop so earlier statements replay too.
*/
function queryWithRetry(PDO $pdo, string $sql, array $params = [], int $maxAttempts = 3): PDOStatement
{
for ($attempt = 1; $attempt <= $maxAttempts; $attempt++) {
try {
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
return $stmt;
} catch (PDOException $e) {
$driverCode = isset($e->errorInfo[1]) ? (int) $e->errorInfo[1] : 0;
$isTransient = in_array($driverCode, TRANSIENT_SERVER_ERROR_CODES, true);
if (!$isTransient || $attempt === $maxAttempts) {
error_log(sprintf('query failed on attempt %d/%d: %s', $attempt, $maxAttempts, $e->getMessage()));
throw $e;
}
$delay = 2 ** ($attempt - 1);
error_log(sprintf('query attempt %d hit transient code %d; retrying in %d seconds', $attempt, $driverCode, $delay));
sleep($delay);
}
}
throw new RuntimeException('queryWithRetry exhausted retries');
}
// Load endpoint details from application configuration. In Azure App Service,
// these can come from app settings or Key Vault-backed settings.
$server = getenv('SQL_SERVER') ?: null;
$database = getenv('SQL_DATABASE') ?: null;
if ($server === null || $database === null) {
throw new RuntimeException('Set SQL_SERVER and SQL_DATABASE in your application configuration.');
}
$dsn = sprintf(
'sqlsrv:Driver={ODBC Driver 18 for SQL Server};Server=%s;Database=%s;'
. 'Encrypt=true;TrustServerCertificate=false;'
. 'LoginTimeout=90;Authentication=ActiveDirectoryMsi;'
. 'ConnectRetryCount=5;ConnectRetryInterval=15;'
. 'MultiSubnetFailover=true;',
$server,
$database
);
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::SQLSRV_ATTR_QUERY_TIMEOUT => 30,
];
$pdo = connectWithRetry($dsn, $options);
$stmt = queryWithRetry($pdo, 'SELECT TOP (?) name FROM sys.databases ORDER BY name', [5]);
foreach ($stmt as $row) {
echo $row['name'], PHP_EOL;
}
Det här kodfragmentet är justerat för Azure SQL Database redundansgrupper och Azure SQL Managed Instance.
Driver={ODBC Driver 18 for SQL Server}pinnar ODBC 18-drivern. Om värden också har ODBC 17 installerad kan PDO_SQLSRV binda till ODBC 17. Äldre 17.x-versioner avvisar nyareAuthenticationvärden; till exempelAuthentication=ActiveDirectoryMsikräver ODBC 17.3.1.1 eller en senare version. Se Ogiltigt värde angivet för attributet 'Authentication i reťazec pripojenia.ConnectRetryCountochConnectRetryIntervalär ODBC-reťazec pripojenia-nyckelord som möjliggör SQL Server inaktiva anslutningsresiliens: drivrutinen återansluter transparent en trasig vilo-anslutning. Det skiljer sig från applikationsnivåqueryWithRetry, som försöker om en sats som misslyckas med ett tillfälligt fel, såsom deadlock eller frågetidsavbrott. De två kompletterar varandra, så behåll båda. Se tillLoginTimeoutatt åtminstoneConnectRetryCount * ConnectRetryIntervalden inaktiva återanslutningsvägen får sin fulla budget; provet använder 90 sekunder för att täcka 5 × 15 sekunder av omprövningar plus utrymme för den initiala inloggningen vid kall failover.Komplettera applikationsnivåanropen
error_log()med diagnostik på förarsidan. För PDO_SQLSRV, sättpdo_sqlsrv.log_severityiphp.ini(kan endast ställas vid initialisering); för SQLSRV, anropasqlsrv_configure("LogSubsystems", ...)vid körning. För mer information, se Loggningsaktivitet.; php.ini - enable PDO_SQLSRV driver diagnostics alongside the application-level ; error_log() calls in the sample. Use 1 (errors) in production; -1 (all) is ; useful during triage but very chatty. [pdo_sqlsrv] pdo_sqlsrv.log_severity = 1För en användartilldelad hanterad identitet, skicka identitetens ID som PDO:s
$usernameargument (new PDO($dsn, $identityId, null, $options)). Använd identitetens klient-ID på Azure App Service eller Azure Container Instance; annars använd dess objekt-ID. PHP-drivrutinerna ärver detta beteende från den underliggande Microsoft ODBC-drivrutinen för SQL Server; för mer information, se Användning av Microsoft Entra ID med ODBC-drivrutinen. PDO_SQLSRV avvisarUIDinuti DSN:n, så använd konstruktörplatsen. Att passeranullsom användaren (som exemplet gör) väljer den systemtilldelade hanterade identiteten för Azure-värden. För SQLSRV (procedurur), skickaUIDin anslutningsoptionsmatrisen.Ställ in
MultiSubnetFailover=truenär du ansluter till en failover-grupplyssnare, tillgänglighetsgrupplyssnare eller failoverkluster-instansändpunkt. Att ställa in den förbättrar anslutningsprestandan för både single-subnet- och multi-subnet tillgänglighetsgrupplyssnare. För mer information, se Support for High Availability, katastrofåterställning.För läst skalning eller läsbar sekundär, lägg till
ApplicationIntent=ReadOnlyi Data Source Name (DSN).För suveräna moln där certifikatets Subject Alternative Name (SAN) inte inkluderar värden du ansluter till, lägg till
HostNameInCertificatei DSN (till exempel*.database.usgovcloudapi.netför Azure Government).Drivrutinen förlitar sig på den underliggande Microsoft ODBC-drivrutinen för SQL Server för tokeninsamling. Managed identity-, service principal- och access-token-flöden går alla via ODBC. Mer information finns i Använda Microsoft Entra-ID med ODBC-drivrutinen.
För högre säkerhet och portabilitet mellan miljöer, håll anslutningsinformationen utanför din kod. Lagra anslutningsinformation i applikationens konfigurationssystem och använd Azure Key Vault för känsliga värden och centralt hanterade anslutningsinställningar.
Den motsvarande SQLSRV-anslutningen använder
sqlsrv_connect($server, ['Database' => $database, 'Encrypt' => true, 'Authentication' => 'ActiveDirectoryMsi', /* ... */])och returnerar en resurs. Återförsöksmönstret är detsamma: fånga enfalseretur frånsqlsrv_connect, inspekterasqlsrv_errors()för SQLSTATE och backa innan du försöker igen. För ett genomarbetat exempel, se steg 4: Anslut robust till SQL med PHP.Hjälparna till återförsök läser
$e->errorInfo[1]bevakade avisset().PDOException::$errorInfodeklareras som?arrayoch går som standard tillnull, så den defensiva kontrollen faller tillbaka på en drivrutinskod av0och låter SQLSTATE-prefixet08avgöra om det ska försöka igen.
Mer information om varje del av den här konfigurationen finns i:
- Anslutningsalternativ
- Ansluta med Microsoft Entra-autentisering
- Vilolägesanslutningsresiliens
- Ansluta till Microsoft Azure SQL Database
- Stöd för hög tillgänglighet, katastrofåterställning
Katalogen med Azure SQL tillfälliga fel finns i Felsöka tillfälliga anslutningsfel.
Viktiga funktioner
- Två API:er, ett drivrutinspaket: Procedural SQLSRV för SQL Server-först-kod, eller PDO_SQLSRV för portabel PDO-kod.
- Brett plattformsstöd: Körs på Windows, Linux och macOS med stödda PHP-versioner.
-
Krypterade anslutningar: TLS-krypterade anslutningar via
Encrypt=true, med validering av servercertifikat kontrollerad avTrustServerCertificate. - Microsoft Entra ID-autentisering: Lösenordslösa anslutningar med hanterad identitet, tjänsteprincip och åtkomsttoken flödar genom den underliggande Microsoft ODBC-drivrutinen för SQL Server.
- Always Encrypted: Kryptering på klientsidan för känsliga kolumner, med valfria säkra enklaver för åtgärder på plats.
-
Anslutningsresiliens: Inbyggda inaktiva anslutningsförsök med
ConnectRetryCountochConnectRetryInterval. - PHP-strömmar: Läs och skriv stora binär- och teckenvärden som strömmar istället för att ladda in dem i minnet.
-
Stöd för datatyper i Rich SQL Server: datetimeoffset, tabellvärda parametrar, nvarchar och Unicode med
PDO::SQLSRV_ENCODING_UTF8.
Get started
| Artikel | Description |
|---|---|
| Systemkrav | Stödde PHP, operativsystem och SQL Server-versioner. |
| Supportmatris | Detaljerad kompatibilitetsmatris för PHP-drivrutinsreleaser. |
| Ladda ner Microsoft-drivrutinerna för PHP för SQL Server | Ladda ner länkar och släpp artefakter. |
| Installationsguide för Linux och macOS | Installera drivrutinen och dess ODBC-förkunskaper på Linux och macOS. |
| Laddar drivrutinerna | Aktivera tilläggen i php.ini. |
| Att komma igång med PHP SQL-drivrutinen | Genomgång från början till slut som binder ihop de fyra startstegen. |
| Översikt av PHP SQL-drivrutinen | Vad som finns i paketet, och när man ska välja SQLSRV eller PDO_SQLSRV. |
Konfigurera och ansluta
| Artikel | Description |
|---|---|
| Anslutning till servern | Öppna en anslutning till en SQL Server-instans från PHP. |
| Anslutningsalternativ | Fullständig referens för anslutningsnyckelord, standardinställningar och hur man sätter dem. |
| Ansluta till Microsoft Azure SQL Database | Koppla en PHP-applikation till Azure SQL Database. |
| Koppla upp på en angiven port | Rikta in dig på en icke-standard TCP-port. |
| Anslutningspoolning | Återanvänd ODBC-anslutningar över PHP-förfrågningar. |
| Inaktivera flera aktiva resultatuppsättningar (MARS) | Stäng av MARS för kompatibilitet. |
| Stöd för LocalDB | Anslut dig till en SQL Server LocalDB-instans. |
| Stöd för hög tillgänglighet, katastrofåterställning | Tillgänglighetsgrupplyssnare och redundans för flera undernät. |
| Vilolägesanslutningsresiliens | Automatisk återanslutning vid trasiga viloförbindelser. |
Authenticate
| Artikel | Description |
|---|---|
| Ansluta med Microsoft Entra-autentisering | Flöden för hanterad identitet, tjänstehuvudansvarig, åtkomsttoken och lösenord. |
| Koppla upp med SQL Server-autentisering | Använd en SQL-inloggning med användarnamn och lösenord. |
| Koppla upp dig med Windows authentication | Använd Windows integrerad autentisering på domänanslutna värdar. |
Secure
| Artikel | Description |
|---|---|
| Säkerhetsöverväganden | Hotmodell och defensiv djupgående vägledning för PHP-applikationer. |
| Alltid krypterat med PHP-drivrutinerna | Konfigurera kryptering på klientsidan för känsliga kolumner. |
| Always Encrypted med säkra enklaver | Möjliggör rika operationer på krypterade kolumner med säkra enklaver. |
Hämta och uppdatera data
| Artikel | Description |
|---|---|
| Programguide | En änd-till-änd programmeringsguide för båda drivrutinerna. |
| Jämförelse av exekveringsfunktioner | Välj rätt exekveringsfunktion för din arbetsbelastning. |
| Direkt och förberedd satsexekvering (PDO_SQLSRV) | När man ska använda direkt exekvering kontra förberedda satser. |
| Hämta data | Hämta rader, kolumner och strömningsvärden. |
| Uppdatering av data | Lägg in, uppdatera och ta bort rader. |
| Utför parameteriserade frågor | Bind parametrar för att skydda mot SQL-injektion. |
| Skicka data som en ström | Strömma stora binära och teckenvärden till SQL Server. |
| Genomföra transaktioner | Gruppera uttalanden i atomära transaktioner. |
| Använd tabellvärda parametrar | Skicka en TABLE parameter till en lagrad procedur. |
| Ange en markörtyp och markera rader | Välj framåtriktade, statisk, dynamisk eller keyset-markörer. |
Datatyper
| Artikel | Description |
|---|---|
| Konvertering av datatyper | Hur drivrutinen mappar PHP-typer till SQL Server-typer. |
| Standardtyper av SQL Server-data | Standard SQL Server-typ för varje PHP-värde. |
| Standard PHP-datatyper | Standard PHP-typ för varje SQL Server-kolumntyp. |
| Specificera SQL Server-datatyper (SQLSRV) | Överskriv SQL Server-typen när parametrar binds. |
| Specificera PHP-datatyper | Åsidosätt PHP-typen när du hämtar. |
| Skicka och hämta UTF-8-data | Använd PDO::SQLSRV_ENCODING_UTF8 för Unicode-tur-och-retur-resor. |
| Skicka och hämta ASCII-data på Linux och macOS | Hantera ASCII-rundresor på icke-Windows-värdar. |
| Formatera decimaler och pengar (SQLSRV) | Formatera decimal - och penningkolumner med SQLSRV-drivrutinen. |
| Formatdecimal och pengar (PDO_SQLSRV) | Formatera decimal - och penningkolumner med PDO_SQLSRV driver. |
| Icke-systembaserade platsinställningar | Lokaliserade decimalseparatorer och andra lokala överväganden. |
Fel och diagnostik
| Artikel | Description |
|---|---|
| Hantering av fel och varningar | Fel- och varningshantering med båda drivrutinerna. |
| Konfigurera fel- och varningshantering (SQLSRV) | Justera hur SQLSRV-drivrutinen rapporterar fel och varningar. |
| Hantera fel och varningar (SQLSRV) | Inspektera fel som returneras av SQLSRV-funktioner. |
| Skogsverksamhet | Aktivera drivrutinsloggning för diagnostikfångst. |
Distribuera och driva
| Artikel | Description |
|---|---|
| Prestandaoptimering | Anslutningshantering, batching, förberedda satser, markörer, minne och serverövervakning. |
| Felsökning | Diagnostisera vanliga problem med installationer, anslutningar, förfrågningar, datatyp, transaktioner och container. |
Reference
| Artikel | Description |
|---|---|
| SQLSRV-drivrutins-API-referens | Alla sqlsrv_* funktioner, parametrar och returvärden. |
| PDO_SQLSRV förarreferens | PDO- och PDOStatement-metoder stöds av den PDO_SQLSRV drivrutinen. |
| Konstanter | Konstanter som exponeras av drivrutinerna, inklusive typ- och kodningskonstanter. |
Relaterade uppgifter
| Artikel | Description |
|---|---|
| Viktig information | Per-versionshistorik med nya funktioner, buggfixar, plattformsstödändringar och nedladdningslänkar. |
| Om kodexempel i dokumentationen | Konventioner som används av kodexemplen i detta avsnitt. |
| Kodexempel för PHP SQL-drivrutinen | End-to-end-exempelapplikationer för SQLSRV och PDO_SQLSRV. |
| Stödresurser | Gemenskap och stödkanaler. |