Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A Microsoft Drivers for PHP for SQL Server olyan PHP-kiterjesztések, amelyekkel PHP-szkriptekből adatokat olvashat és írhat a Microsoft SQL Database Engine rendszerben. A két bővítmény ugyanazt a Microsoft ODBC Driver for SQL Server-t használja, de eltérő PHP API-kat és illesztő-specifikus lehetőségeket kínálnak:
-
Az SQLSRV egy eljárási API-t (
sqlsrv_*függvényeket) tár ki, amely az SQL Server funkcióira szabott. - PDO_SQLSRV megvalósítja a PHP Data Objects (PDO) interfészt. A PDO hívásokat megtarthatod a meglévő adatbáziskódban, de mielőtt adatbázist váltasz, nézd át a lekérdezéseit és az illesztőprogram-specifikus beállításokat.
Mindkét illesztőprogram csatlakozik az Azure SQL Database-hez, a Microsoft Fabric SQL-adatbázisához, az Azure SQL Managed Instance-hez, valamint a SQL Server összes támogatott verziójához és kiadásához, beleértve az Express kiadásokat is. Mindkét meghajtó elfogadja a PHP streameket bemeneti paraméterként. Az SQLSRV támogatja a nagy bináris és karakterértékek streamként történő lekérését. Ne feltételezd, hogy PDO_SQLSRV ugyanazt a kimeneti streaming viselkedést mutatná.
Válassza ki a kiindulási pontot
- A telepítés ellenőrzéséhez, valamint paraméterezett lekérdezés futtatásához SQLSRV vagy PDO_SQLSRV használatával induljon a következővel: Rövid útmutató: Kapcsolódás és lekérdezés a Microsoft Drivers for PHP használatával.
- A drivert telepíteni Linuxra vagy macOS-re kezdje a Linux és macOS telepítési útmutatójával, majd töltse le a Microsoft Drivers for PHP for SQL Server-t.
- Az Azure SQL-hez jelszó nélküli hitelesítéssel történő csatlakozáshoz kezdje a Csatlakozás Microsoft Entra-hitelesítéssel és a Kapcsolati beállítások témakörökkel.
- Ha egy meglévő alkalmazást átmeneti hibákkal szemben ellenállóvá szeretne tenni, lépjen az Idle connection resiliency menüpontra.
- Az SQLSRV és a PDO_SQLSRV közötti választáshoz látogasson el a Overview of the Microsoft Drivers for PHP for SQL Server és a Comparing execution functions oldalra.
- Telepítési, csatlakozási vagy lekérdezési problémák diagnosztizálásához menj a Hibakeresés, Hibák és figyelmeztetések kezelése, valamint Tevékenység naplózása.
- Ha egy meglévő alkalmazást gyorsabban szeretnél elérni, menj a Teljesítmény hangolás menübe.
Azure SQL üzemi alapkonfigurációja
Ez a PDO_SQLSRV példa a szervert és az adatbázist a környezeti változókból olvassa, és egy menedzselt identitással csatlakozik. Adatforrásnevet (DSN) épít, és engedélyezi a Transport Layer Securityt (TLS) tanúsítvány-ellenőrzéssel. Ezeket az értékeket az alkalmazás konfigurációjából olvassa ki, nem webes kérelmek paramétereiből. Futtassa a programot egy hoszton, amelynek menedzseltidentitás-végpontja van, miután hozzáférést adott az identitásnak az adatbázishoz.
A segédfunkciók legfeljebb három próbálkozást tesznek a kapcsolódásra vagy a csak olvasható lekérdezés futtatására, amikor felsorolt hiba jelentkezik. Hosszabb ideig várnak a próbálkozások között, ezt az újrapróbálkozási mintázatot exponenciális visszavonulásnak nevezik. Ha egy lekérdezési hiba új kapcsolatot igényel, a lekérdezéssegítő kivételt dob, amelyet a hívó kód kezel.
Használj támogatott PHP verziót, az PDO_SQLSRV kiterjesztést és Microsoft ODBC Driver 18-at SQL Server eléréséhez. A támogatott hitelesítési értékekről lásd: Kapcsolódás Microsoft Entra-hitelesítéssel. Ne használd újra a lekérdezési segítőt írásokhoz vagy több utasításból álló tranzakciókhoz anélkül, hogy alkalmazásspecifikus újrapróbálási szabályzatot terveznél: a hiba nem mindig mondja meg, hogy az írás véglegesítésre került-e.
<?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];
// This read helper retries only the listed errors on the same connection.
// Other errors propagate; the caller must decide whether to reconnect.
const RETRYABLE_READ_ERROR_CODES = [1205, 1222, 40501, 10928, 10929];
/**
* 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);
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');
}
/**
* Retry the standalone read-only query for errors that allow connection reuse.
*/
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, RETRYABLE_READ_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.');
}
$databaseValue = '{' . str_replace('}', '}}', $database) . '}';
$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,
$databaseValue
);
$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 name FROM sys.databases WHERE database_id > ? ORDER BY name', [1]);
foreach ($stmt as $row) {
echo $row['name'], PHP_EOL;
}
Használd ezeket a beállításokat Azure SQL Database failover csoportokhoz és Azure SQL Managed Instance-hoz.
Driver={ODBC Driver 18 for SQL Server}kifejezetten kiválasztja az ODBC Driver 18-at, nem pedig az illesztőprogram-felfedezésre hagyatkozik. Telepítsd ezt a példa futtatása előtt.Állítsd
SQL_DATABASEbe a tényleges adatbázis névre. A program megduplázza a záró kapcsos zárójeleket, és a nevet kapcsos zárójelek közé teszi, mielőtt behelyezi a DSN-be. Az escaping megakadályozza, hogy a név speciális karakterei megváltoztassanak, hogyan olvassa a driver a kapcsolati beállításokat.ConnectRetryCountvalamintConnectRetryIntervalaz ODBC alaplati kapcsolat ellenállóképességének szabályozása. Az utasítás lekérdezési időtúllépése a végrehajtás során korlátozza a helyreállítást. A minta 30 másodperces lekérdezési időkorlátával az ODBC megállhat, mielőtt mind az öt újrakapcsolási kísérletet kimerítené.LoginTimeout=90A kapcsolat létrehozását szabályozza, nem a helyreállítási keretet. Az alkalmazásszintű segítő újra megpróbálja a kiválasztott szerverhibákat; nem próbálja újra a lekérdezés időtúllépését, és nem játszik vissza részben lehozott eredményeket.Engedélyezd a driver logolást a program
error_log()hívásai mellett. PDO_SQLSRV esetén állítsa bepdo_sqlsrv.log_severityértékét a(z)php.inifájlban, vagy futásidőben a(z)ini_set()használatával. SQLSRV esetén konfiguráldLogSeverityésLogSubsystems.sqlsrv_configure()További információért lásd: Naplózás tevékenység.; 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 = 1Egy felhasználó által hozzárendelt felügyelt identitás esetén adja meg az identitás azonosítóját a PDO
$usernameargumentumaként (new PDO($dsn, $identityId, null, $options)). Használja az identitás kliensazonosítójátaz Azure App Service-en vagy az Azure Container Instance-on; egyébként használja az objektumazonosítóját. A PHP illesztőprogramok ezt a viselkedést az alapul szolgáló Microsoft ODBC Driver for SQL Server-től öröklik; további információért lásd: Microsoft Entra ID használata az ODBC Driverrel. Használd a PDO konstruktor felhasználónév argumentumát ahelyett, hogy a felhasználóazonosítót a DSN-be ágyaznád. Ha a(z)nullértéket adja át felhasználóként (ahogyan a mintában is), az Azure-gazdagép rendszer által hozzárendelt felügyelt identitását választja ki. SQLSRV (eljárásos) esetén adja át a(z)UIDértéket a kapcsolati beállításokat tartalmazó tömbben.Állítsd be,
MultiSubnetFailover=truemikor csatlakozol failover-csoporthallgatóhoz, elérhetőségi csoporthallgatóhoz vagy failover klaszter instance végponthoz. Beállítása javítja a kapcsolati teljesítményt mind az egyalnetes, mind a többalnevetes elérhetőségi csoport hallgatói számára. További információkért lásd: A magas rendelkezésre állás és a vészhelyreállítás támogatása.Olvasási skálázáshoz vagy olvasható másodlagos replikához add hozzá a
ApplicationIntent=ReadOnlyelemet a DSN-hez.Használd az SQL szolgáltatásod által biztosított végpontot, beleértve annak felhőspecifikus domainjét is. Vizsgáld meg a tanúsítvány-név eltéréseket, ahelyett, hogy kikapcsolnád a tanúsítvány validálását. Csak akkor használd
HostNameInCertificate, ha ismered az adott végpont várható tanúsítványnevét.Az ODBC tokeneket szerz be menedzselt identitáshoz és szolgáltatási alaphitelesítéshez. A
AccessTokenhasználatával az alkalmazásod megszerzi a tokent, és átadja a meghajtónak; Az ODBC nem szerzi meg helyetted. További információ: A Microsoft Entra ID használata az ODBC-illesztővel.Tartsd a kapcsolati információkat a kódodon kívül. Tárold az alkalmazásod konfigurációs rendszerében, és használd az Azure Key Vault-t titkokhoz.
Az SQLSRV esetében állítsa be a kapcsolati beállításokat a
sqlsrv_connect()elemnek átadott tömbben. Ellenőrizd afalsevisszatérési értéket, és ellenőrizd asqlsrv_errors()elemet, mielőtt eldöntöd, hogy újra próbálkozol-e. Állítsuk be az utasítás időtúllépéseit külön a(z)QueryTimeouthasználatával. Az inaktív kapcsolat helyreállítása ODBC-újracsatlakozást mutat be, nem pedig alkalmazásszintű újrapróbálási hurkot.Az újrapróbálkozási segédfüggvények a
$e->errorInfo[1]elemet aisset()által védve olvassák.PDOException::$errorInfodeklarálva van mint?array, és alapértelmezett értékenull, ezért a védelmi ellenőrzés egy0illesztőprogram-kódra tér vissza, és az SQLSTATE08előtagja dönti el, hogy újrapróbálkozik-e.
A konfiguráció egyes részeivel kapcsolatos további információkért lásd:
- Kapcsolati beállítások
- Csatlakozás Microsoft Entra-hitelesítéssel
- Az inaktív kapcsolat rugalmassága
- Csatlakozás a Microsoft Azure SQL Database-hez
- Magas rendelkezésre állás támogatása, katasztrófa utáni helyreállítás
Az átmeneti Azure SQL hibakatalógusát az átmeneti csatlakozási hibák hibaelhárítása című témakörben találja.
Legfontosabb funkciók
- Két PHP API: az SQLSRV procedurális funkciókat biztosít. PDO_SQLSRV PDO-t valósít meg. Telepíts egy bővítményt vagy mindkettőt.
- Széles platformtámogatás: Windows-on, Linuxon és macOS-en fut, támogatott PHP verziókkal.
-
Titkosított kapcsolatok: TLS-sel titkosított kapcsolatok
Encrypt=truehasználatával, a szervertanúsítvány ellenőrzését pedig aTrustServerCertificatevezérli. -
Microsoft Entra ID hitelesítés: Menedzselt identitás, szolgáltatási alap és külső hozzáférési tokenek az alapul szolgáló Microsoft ODBC Driver for SQL Server segítségével. A felügyelt identitás jelszó nélküli; a
ActiveDirectoryServicePrincipalügyféltitkot használ. - Always Encrypted: Titkosítsd az ügyféloldalon az érzékeny oszlopokat, biztonságos enklávékkal a titkosított adatokon végzett támogatott műveletekhez.
-
Kapcsolat rugalmassága: beépített újrapróbálkozások üresjárati kapcsolatokhoz
ConnectRetryCountésConnectRetryIntervalhasználatával. - PHP adatfolyamok: Küldj nagy bináris és karakterértékeket streamparaméterek használatával bármelyik API-val. Használj SQLSRV-t streamelt lekérdezéshez.
-
Az SQL Server adattípusainak széles körű támogatása: datetimeoffset, táblázatértékű paraméterek, nvarchar és Unicode
PDO::SQLSRV_ENCODING_UTF8.
Első lépések
| Cikk | Description |
|---|---|
| Rendszer követelmények | Támogatta a PHP, operációs rendszer és SQL Server verziókat. |
| Támogatási mátrix | Részletes kompatibilitási mátrix PHP driver kiadásokhoz. |
| Töltse le a Microsoft Drivers for PHP for SQL Server | Letöltési hivatkozások és kiadási összetevők. |
| Telepítési útmutató Linux és macOS számára | Telepítsd a drivert és annak ODBC előfeltételeit Linuxon és macOS-en. |
| A meghajtók betöltése | Engedélyezd a kiterjesztéseket itt: php.ini. |
| Gyorsindítás: Csatlakozz és kérdezz a Microsoft PHP Driverekkel | Ellenőrizd a bővítményeket, konfiguráld a kapcsolatot, és futtasd le ugyanazt a paraméterezett lekérdezést SQLSRV-vel vagy PDO_SQLSRV-vel. |
| A PHP SQL illezőprogramjának áttekintése | Mi van a csomagban, és mikor válasszuk SQLSRV-t vagy PDO_SQLSRV-t. |
Konfigurálás és csatlakoztatás
| Cikk | Description |
|---|---|
| Csatlakozás a szerverhez | Nyiss kapcsolatot egy SQL Server példányhoz a PHP-ből. |
| Kapcsolati beállítások | Teljes hivatkozás a kapcsolati kulcsszavakhoz, alapértelmezetekhez és azok beállításához. |
| Csatlakozás a Microsoft Azure SQL Database-hez | Kapcsold egy PHP alkalmazást Azure SQL Database-be. |
| Csatlakozz egy meghatározott porthoz | Célozz meg egy nem alapértelmezett TCP portot. |
| Kapcsolatkészletezés | Használd újra az ODBC kapcsolatokat a PHP kérések során. |
| A több aktív eredményhalmaz (MARS) letiltása | Kapcsold ki a MARS-t a kompatibilitás miatt. |
| A LocalDB támogatása | Csatlakozz egy SQL Server LocalDB instance-hoz. |
| Magas rendelkezésre állás támogatása, katasztrófa utáni helyreállítás | A rendelkezésre állási csoport figyelői és a többalhálózatos feladatátvétel. |
| Az inaktív kapcsolat rugalmassága | Automatikus újracsatlakozás a hibás alapjárati kapcsolatok esetén. |
Authenticate
| Cikk | Description |
|---|---|
| Csatlakozás Microsoft Entra-hitelesítéssel | Menedzselt identitás, szolgáltatási alap, hozzáférési token és jelszóáramlások. |
| Csatlakozz SQL Server hitelesítéssel | Használj SQL bejelentkezést felhasználónévvel és jelszóval. |
| Csatlakozz Windows authentication használatával | Használj integrált hitelesítést Windowson vagy Kerberost Linuxon és macOS-en. |
Secure
| Cikk | Description |
|---|---|
| Biztonsági szempontok | Fenyegetési modell és mélyreható védelmi útmutató PHP alkalmazásokhoz. |
| Mindig titkosítva a PHP illesztőprogramokkal | Ügyféloldali titkosítás konfigurálása bizalmas oszlopokhoz. |
| Mindig titkosított, biztonságos enklávékkal | Összetett műveletek engedélyezése titkosított oszlopokon biztonságos enklávék használatával. |
Adatok lekérése és frissítése
| Cikk | Description |
|---|---|
| Műsorvezetés | Találj programozási feladatokat mindkét járművezető számára. |
| Végrehajtási függvények összehasonlítása | Válaszd ki a megfelelő végrehajtási függvényt a munkaterhelésedhez. |
| Közvetlen és előkészített utasítások végrehajtása (PDO_SQLSRV) | Mikor kell közvetlen végrehajtást használni a előre készített utasítások helyett? |
| Adatok visszakeresése | Hívd be sorokat, oszlopokat és streaming értékeket. |
| Adatok frissítése | Sorok beépítése, frissítése és törlése. |
| Paraméterezett lekérdezések végrehajtása | Bind paraméterek az SQL injekció elleni védelem érdekében. |
| Adatküldés streamként | Streamelj nagy bináris és karakterértékeket az SQL Server-be. |
| Tranzakciók végrehajtása | Egy utasításcsoportot együtt véglegesíts vagy vond vissza. |
| Táblázatértékű paraméterek használata | Átadj egy TABLE paramétert egy tárolt eljárásnak. |
| Határozz meg kurzortípust, és válaszd ki a sorokat | Válassz csak előre irányuló, statikus, dinamikus vagy keyset kurzorokat. |
Adattípusok
| Cikk | Description |
|---|---|
| Adattípusok átalakítása | Hogyan felelteti meg a meghajtó a PHP-típusokat az SQL Server-típusoknak. |
| Alapértelmezett SQL Server adattípusok | Minden PHP értékhez alapértelmezett SQL Server típus. |
| Alapértelmezett PHP adattípusok | Minden SQL Server oszloptípushoz alapértelmezett PHP típus. |
| Adja meg az SQL Server adattípusait (SQLSRV) | Felülírd az SQL Server típust paraméterkötéskor. |
| Határozd meg a PHP adattípusokat | Felülírd a PHP típust a lekéréskor. |
| UTF-8 adatok küldése és letöltése | Állítsd be az CharacterSet SQLSRV opcióját vagy a PDO_SQLSRV PDO::SQLSRV_ATTR_ENCODING attribútumját. |
| ASCII adatok küldése és letöltése Linuxon és macOS-en | Kezeld az ASCII oda-vissza utazásokat nem Windows hasztokon. |
| Tizedesértékek és pénzösszegek formázása (SQLSRV) | Formázd a decimális és pénz oszlopokat az SQLSRV driverrel. |
| Decimális számok és pénzösszegek formázása (PDO_SQLSRV) | Formázd a tizedes és pénzoszlopokat a PDO_SQLSRV meghajtóval. |
| Nem rendszerszintű helyszínbeállítások | Lokalizált tizedesválasztók és egyéb helyi szempontok. |
Hibák és diagnosztikák
| Cikk | Description |
|---|---|
| Kezelési hibák és figyelmeztetések | A hibák és figyelmeztetések kezelése mindkét illesztőprogram esetén. |
| Hiba- és figyelmeztetéskezelés konfigurálása (SQLSRV) | Beállíthatja, hogyan jelezze az SQLSRV illesztőprogram a hibákat és figyelmeztetéseket. |
| Hibák és figyelmeztetések kezelése (SQLSRV) | Az SQLSRV függvények által visszaküldött hibák ellenőrzése. |
| Naplózási tevékenység | Engedélyezd az illesztőprogram-naplózást a diagnosztikai adatok rögzítéséhez. |
Üzembe helyezés és üzemeltetés
| Cikk | Description |
|---|---|
| Teljesítmény finomhangolása | Kapcsolatkezelés, kötegelt feldolgozás, előkészített lekérdezések, kurzorok, memória és szerveroldali monitorozás. |
| Troubleshooting | Diagnosztizálni a gyakori telepítési, kapcsolati, lekérdezési, adattípust, tranzakciót és konténerproblémákat. |
Hivatkozási tartalom
| Cikk | Description |
|---|---|
| SQLSRV-illesztőprogram API-referenciája | Minden sqlsrv_* függvény, paraméter és visszaadó érték. |
| PDO_SQLSRV vezetői referencia | A PDO és PDOStatement módszereket a PDO_SQLSRV driver támogatja. |
| állandók | A meghajtók által felfedett állandók, beleértve a típus- és kódolási állandókat. |
Kapcsolódó tevékenységek
| Cikk | Description |
|---|---|
| Kiadási megjegyzések | Verziónkénti előzmények új funkciókkal, hibajavításokkal, platformtámogatási változásokkal és letöltési linkekkel. |
| A dokumentációban található kódmintákról | A kódminták által használt konvenciók ebben a szakaszban. |
| Kódminták a PHP SQL driverhez | Végponttól végpontig példa alkalmazások SQLSRV és PDO_SQLSRV számára. |
| Támogató források | Közösségi és támogató csatornák. |
Szolgáltatás igénylése
Funkció kéréséhez nyiss meg egy problémát a Microsoft Drivers for PHP for SQL Server GitHub repozióriumban.