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.
SQLSRV- och PDO_SQLSRV drivrutinerna ansluter till följande Azure och Fabric SQL-mål med ett fullt kvalificerat servernamn och anslutningsalternativen i anslutningsalternativen. SQLSRV tar en optionsarray; PDO_SQLSRV tar ett datakällnamn (DSN), separata autentiseringsargument vid behov och PDO-attribut.
| Target | Formulär för servernamn | Notes |
|---|---|---|
| Azure SQL Database | <server>.database.windows.net |
|
| Hanterad instans i Azure SQL | Den offentliga eller privata slutpunkten för din instans | Kräver nätverksanslutning via ett virtuellt nätverk, virtuellt privat nätverk (VPN) eller publik slutpunkt. |
| Azure Synapse Analytics (dedikerad SQL-pool i en arbetsyta) | <workspace>.sql.azuresynapse.net |
Transact-SQL-satser (T-SQL) som stöds skiljer sig från SQL Server. För stödd syntax, se Synapse SQL-dokumentationen. |
| SQL-databas i Microsoft Fabric | Kopiera servern och databasen från databasobjektets inställningar>anslutningssträngar | Använd SQL-databasanslutningen, inte SQL-analysändpunkten. Microsoft Entra-autentisering krävs. Mer information finns i Ansluta till SQL-databas i Fabric. |
| Lager i Microsoft Fabric | Kopiera lagrets SQL-reťazec pripojenia från Fabric-portalen | Ställ Database in på lagernamnet och MultipleActiveResultSets till false. Microsoft Entra-autentisering krävs. För mer information, se Lageranslutning. |
Båda PHP-tilläggen aktiverar Multiple Active Result Sets (MARS) som standard. Warehouse stöder inte MARS, så inaktivera det uttryckligen i SQLSRV-optionsarrayen eller PDO_SQLSRV DSN. SQL-databas i Fabric och Warehouse är separata produkter; anta inte att en funktion som stöds av den ena också stöds av den andra.
Förbered endpoint, identitet och PHP-värd
Din PHP-process behöver nätverksåtkomst till SQL-endpointen, ett stödd sätt att logga in och behörighet att öppna den valda databasen. Kontrollera varje krav separat. Till exempel ger öppnandet av en brandväggsport inte tillgång till databasen.
- Installera PHP-tillägget och Microsoft ODBC-drivrutinen på maskinen eller containern som kör PHP. Verifiera filändelsen i den processen, inte bara i en utvecklingsterminal. För mer information, se Läsa in drivrutinerna.
- Kopiera servern och databasen från målets anslutningsdetaljer. Inkludera inte ett HTTPS-URL-schema. Använd det tjänstangivna värdnamnet så att certifikatvalidering kontrollerar den avsedda slutpunkten. En publik slutpunkt för Azure SQL Managed Instance kan inkludera en icke-standardport; behåll den medföljande porten.
- Konfigurera tjänstens nätverksåtkomst för din PHP-värd. För en privat endpoint, bekräfta privat namnlösning och en rutt från applikationsnätverket. En offentlig brandväggsregel ger ingen rutt till en privat adress.
- Välj den identitet som används av PHP-processen. För en Azure-hostad applikation, aktivera dess hanterade identitet och identifiera om den är systemtilldelad eller användartilldelad. En utvecklares inloggning med Azure CLI är inte applikationens hanterade identitet.
- Låt en databasadministratör ge den identiteten åtkomst till den valda databasen och de minsta behörigheterna som applikationen behöver. För Warehouse, kontrollera även åtkomst till Fabric-objekt och arbetsyta. Azure:s resurshanteringsbehörigheter ger inte i sig tillstånd att köra frågor mot applikationstabeller.
- Sätt
SQL_SERVERochSQL_DATABASEi applikationens konfiguration. Spara inget lösenord för exemplen med hanterad identitet.
Exemplen verifierar en koppling utan att skapa tabeller. Om denna kontroll godkänns bevisar det inte att identiteten kan läsa eller skriva ditt applikationsschema. Testa de faktiska operationerna separat under samma identitet.
Använd lösenordslös Microsoft Entra-autentisering
Använd en managed identity när din värdmiljö exponerar en managed-identity-endpoint och SQL-målet ger den identitetsåtkomsten. Följande kompletta program använder en systemtilldelad hanterad identitet. De är inte exempel på arbetsstationer. Kör dem på den konfigurerade Azure-hosten, med SQL_SERVER och SQL_DATABASE tillgängliga för dess PHP-process.
Båda programmen inaktiverar MARS, så anslutningsinställningen är också lämplig när man väljer Warehouse. De använder ett aktivt uttalande åt gången. För identitetsinställning och andra autentiseringslägen, se Ansluta med Microsoft Entra-autentisering.
Ställ SQL_DATABASE in på det faktiska databasnamnet. Varje program skapar ett separat escaped värde för anslutningen genom att dubbla stängande klammer och omsluta namnet med klammer. Escapning hindrar specialtecken i databasens namn från att ändra hur drivrutinen läser anslutningsinställningar. Programmen behåller det ursprungliga namnet för att kontrollera resultatet av DB_NAME().
SQLSRV
Spara detta program som connect-azure-sqlsrv.php, och kör php connect-azure-sqlsrv.php på den konfigurerade värddatorn.
<?php
$server = getenv('SQL_SERVER');
$database = getenv('SQL_DATABASE');
if ($server === false || $server === '' || $database === false || $database === '') {
throw new RuntimeException('Set SQL_SERVER and SQL_DATABASE.');
}
$databaseValue = '{' . str_replace('}', '}}', $database) . '}';
$conn = sqlsrv_connect($server, [
'Database' => $databaseValue,
'Authentication' => 'ActiveDirectoryMsi',
'Encrypt' => true,
'TrustServerCertificate' => false,
'LoginTimeout' => 30,
'MultipleActiveResultSets' => false,
'CharacterSet' => 'UTF-8',
]);
if ($conn === false) {
throw new RuntimeException(print_r(sqlsrv_errors(), true));
}
$stmt = null;
try {
$stmt = sqlsrv_query(
$conn,
'SELECT DB_NAME() AS DatabaseName, CAST(1 AS int) AS Connected',
[],
['QueryTimeout' => 30]
);
if ($stmt === false) {
throw new RuntimeException(print_r(sqlsrv_errors(), true));
}
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
if ($row === false) {
throw new RuntimeException(print_r(sqlsrv_errors(), true));
}
if ($row !== ['DatabaseName' => $database, 'Connected' => 1]) {
throw new RuntimeException('Unexpected database or connection result.');
}
echo 'Connected to ', $row['DatabaseName'], '.', PHP_EOL;
} finally {
if (is_resource($stmt)) {
sqlsrv_free_stmt($stmt);
}
sqlsrv_close($conn);
}
PDO_SQLSRV
Spara detta separata program som connect-azure-pdo.php, och kör php connect-azure-pdo.php på den konfigurerade värddatorn. Den sätter PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE så att int-resultatet är PHP int. Utan den returnerar PDO_SQLSRV denna kolumn som en sträng som standard. PDO-teckenkodning är ett attribut, inte SQLSRV-alternativet CharacterSet.
<?php
$server = getenv('SQL_SERVER');
$database = getenv('SQL_DATABASE');
if ($server === false || $server === '' || $database === false || $database === '') {
throw new RuntimeException('Set SQL_SERVER and SQL_DATABASE.');
}
$databaseValue = '{' . str_replace('}', '}}', $database) . '}';
$pdo = new PDO(
"sqlsrv:Server=$server;Database=$databaseValue;Authentication=ActiveDirectoryMsi;"
. "Encrypt=true;TrustServerCertificate=false;LoginTimeout=30;"
. "MultipleActiveResultSets=false",
null,
null,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::SQLSRV_ATTR_ENCODING => PDO::SQLSRV_ENCODING_UTF8,
PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE => true,
]
);
$stmt = null;
try {
$stmt = $pdo->prepare(
'SELECT DB_NAME() AS DatabaseName, CAST(1 AS int) AS Connected',
[PDO::SQLSRV_ATTR_QUERY_TIMEOUT => 30]
);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row !== ['DatabaseName' => $database, 'Connected' => 1]) {
throw new RuntimeException('Unexpected database or connection result.');
}
echo 'Connected to ', $row['DatabaseName'], '.', PHP_EOL;
} finally {
$stmt = null;
$pdo = null;
}
Om SQL_DATABASE är appdb, skriver varje program ut:
Connected to appdb.
ActiveDirectoryMsi använder inte din lokala Azure CLI-inloggning. För lokal utveckling eller kontinuerlig integration (CI), välj en autentiseringsmetod som stöds av PHP-tillägget och ODBC-drivrutinen. Du kan få tag på en Microsoft Entra-åtkomsttoken via ett identitetsbibliotek och tillhandahålla den via AccessToken. När du använder en token, ange inte användarnamn, lösenord och inställningen Authentication. Ställ AccessToken in i SQLSRV:s anslutningsoptionsarray eller PDO_SQLSRV DSN. Håll tokens borta från källkoden och loggarna. Mer information finns i Ansluta med Microsoft Entra-autentisering.
ActiveDirectoryServicePrincipal använder ett klient-ID och klienthemlighet; det är inte lösenordslös autentisering. Om du använder den, läs hemlighet från skyddad applikationskonfiguration. SQL-autentisering är ett alternativ endast för mål som stödjer det; varken SQL-databaser i Fabric eller Warehouse stöder SQL-autentisering.
Anpassa autentiseringen till din miljö
Använd en autentiseringsmekanism för varje anslutning. Lämna inte ett gammalt användarnamn, lösenord eller Authentication inställning kvar när du byter till AccessToken.
| Miljö | Configuration | Ansvar |
|---|---|---|
| Azure-värd med en systemtilldelad hanterad identitet | Ställ in Authentication på ActiveDirectoryMsi. Ange inget användarnamn eller lösenord. |
ODBC hämtar token från värdens identitetsändpunkt. |
| Azure host med en användartilldelad hanterad identitet | Ställ in Authentication på ActiveDirectoryMsi. Ange identitetens ID via SQLSRV:s UID alternativ eller PDO:s användarnamnsargument. Ange inget lösenord. |
Det nödvändiga ID:t beror på hostingtjänsten. App Service och Container Instances använder klient-ID; kontrollera ODBC:s identitetsriktlinjer för andra värdar. |
| Arbetsstation eller CI med en extern tokenleverantör | Hämta en token för SQL-tjänsten och sätt sedan AccessToken. Utelämna användarnamn, lösenord och Authentication inställning. |
Din applikation eller identitetsbibliotek hämtar och uppdaterar token. Ingen av PHP-tilläggen använder automatiskt din Azure CLI-inloggning. |
| Tjänstehuvudperson med en klienthemlighet | Ställ in Authentication på ActiveDirectoryServicePrincipal. För SQLSRV, sätt UID till klient-ID och PWD till klienthemligheten. För PDO, skicka klient-ID och hemliga nyckel som konstruktörens användarnamn och lösenordsargument. |
Skydda och rotera den hemliga nyckeln. Den här metoden är inte lösenordslös. |
| SQL-inloggning på ett målsystem som stöder det | SQLSRV använder UID/PWD; PDO använder konstruktörargument två och tre. |
målet validerar SQL-inloggningsuppgifterna. Detta alternativ gäller inte för någon av Fabric-produkterna. |
Begär en token för SQL-tjänsten, inte för Azure-resurshantering. Tokenets målgrupp identifierar tjänsten som accepterar den. För Azure public cloud, begär scope https://database.windows.net/.default från ditt identitetsbibliotek. Bekräfta rätt resurs för ett annat moln. Skicka token till PHP-tillägget som en sträng; konvertera den inte manuellt till en ODBC-access-token-struktur.
En token kan gå ut medan en worker fortsätter att köra. Skaffa en giltig token innan du öppnar en ny anslutning, och uppdatera tokens vid behov i långkörande arbetsprocesser. Logga aldrig ett DSN som innehåller en åtkomsttoken. För mer information om ODBC-autentisering, se Användning av Microsoft Entra ID med ODBC-drivrutinen.
Håll kryptering och identitetskontroller åtskilda
Encrypt=true begär en krypterad transport.
TrustServerCertificate=false kräver validering av servercertifikatet, inklusive dess identitet. Microsoft Entra-autentisering fastställer vem din applikation är; den ersätter inte validering av servercertifikat.
Använd den endpoint som tillhandahålls av SQL-tjänsten och behåll klientoperativsystemets betrodda certifikatarkiv. Byt inte ut värdnamnet mot en IP-adress för att kringgå ett namnlösningsproblem. För en privat endpoint, fixa namnupplösning och routing samtidigt som tjänstens förväntade anslutningsnamn behålls.
LoginTimeout begränsar upprättandet av anslutningar.
QueryTimeout för SQLSRV och PDO::SQLSRV_ATTR_QUERY_TIMEOUT för PDO_SQLSRV gäller för satsexekvering. Att höja frågetidsgränsen kommer inte att åtgärda en saknad endpoint för hanterad identitet eller en felaktig databasanvändare.
Felsökning efter felstadium
| Felsteg | Vad du bör kontrollera |
|---|---|
| PHP kan inte ladda tillägget | Bekräfta körtidsversion, arkitektur, tilläggsbyggande, ODBC-installation och den php.ini som används av applikationsprocessen. |
| Transmission Control Protocol (TCP)-anslutningen överskrider tidsgränsen | Verifiera kopierad endpoint och port, namnupplösning, brandväggsregler, virtuell nätverksrouting och konfiguration av privat endpoint från PHP-värden. |
| Certifikatvalidering misslyckas | Kontrollera endpointens namn, certifikatkedjan och klientens tillitslager. Ha certifikatvalidering aktiverad. |
| Managed identity kan inte skaffa en token | Bekräfta att identiteten är aktiverad på denna värd och att dess identitetsendpoint är tillgänglig. Testa inte ActiveDirectoryMsi på en vanlig laptop och förvänta dig att Azure CLI-inloggning ska uppfylla kraven. |
| Tokenautentisering misslyckas | Kontrollera tokenens avsedda tjänst, utgångsdatum, tenant och identitet. Bekräfta databasåtkomst för den identiteten. Ta bort alla användarnamn, lösenord och inställningar Authentication. |
| Inloggningen lyckas men den valda databasen kan inte öppnas | Bekräfta databasens namn och att dess administratör har skapat den avsedda identiteten eller beviljat den åtkomst. |
| Anslutningen upprättas men en programfråga misslyckas | Kontrollera objektbehörigheter och målets stödda T-SQL-funktioner. Anslutningstestet upprättar inte åtkomst till applikationsschemat. |
| Anslutningsinställningar för Warehouse rejects | Ställ in MultipleActiveResultSets till false i SQLSRV-alternativmatrisen eller PDO DSN, och använd Microsoft Entra-autentisering. |
SQLSRV returnerar false och exponerar en felsamling genom sqlsrv_errors(). PDO-konstruktorn utlöser PDOException; exemplen möjliggör också undantag för satser som misslyckas. Fånga diagnostik omedelbart i begränsade loggar och håll SQLSRV-varningar åtskilda från fel. Returnera inte råa diagnostik, tokens eller anslutningsdetaljer till en webbläsare.
Plan för avbrutna anslutningar
En tjänst kan koppla bort en inaktiv session eller avbryta en operation under underhåll eller failover. ODBC:s återhämtning för inaktiva anslutningar och programmets återförsök löser olika problem. För nyckelord för återförsök och ett kontrollerat frånkopplingstest, se Återtålighet för inaktiva anslutningar.
Spela inte upp en skrivning bara för att klienten tappade sin anslutning. Servern kan ha gjort något innan svaret förlorades. Använd en applikationsspecifik princip för återförsök och ett sätt att upptäcka dubbletter av arbete. Släpp satser och anslutningshandtag när förfrågan eller jobbet är klart, inklusive felvägar. Information om livscykel och poolning finns i Ansluta till servern.