Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Sterowniki firmy Microsoft dla PHP do programu SQL Server to rozszerzenia PHP, które umożliwiają odczytywanie i zapisywanie danych z aparatu bazy danych Microsoft SQL Database Engine w skryptach PHP. Pakiet zawiera dwa sterowniki, które opakowują ten sam sterownik Microsoft ODBC dla SQL Server i dzielą te same opcje połączenia, więc możesz wybrać API pasujące do twojego kodu:
-
SQLSRV udostępnia proceduralne API (
sqlsrv_*funkcje) dostosowane do funkcji SQL Server. - PDO_SQLSRV implementuje interfejs PHP Data Objects (PDO), dzięki czemu kod, który już używa PDO dla innych baz danych, może celować SQL Server przy minimalnych zmianach.
Oba sterowniki łączą się z Azure SQL Database, bazą SQL w Microsoft Fabric, Azure SQL Managed Instance oraz wszystkimi obsługiwanymi wersjami i edycjami SQL Server (w tym edycjami Express). Używają strumieni PHP do przenoszenia dużych wartości binarnych i znakowych bez ładowania ich całkowicie do pamięci.
Wybieranie punktu początkowego
- Aby skonfigurować środowisko programistyczne PHP i uruchomić pierwsze zapytanie, zacznij od kroku 1: Konfiguruj środowisko programistyczne, następnie Krok 2: Stwórz bazę danych SQL i Krok 3: Udowodnij koncepcję połączenia z SQL za pomocą PHP.
- Aby zainstalować sterownik na Linuksie lub macOS, zacznij od samouczka instalacji dla Linuksa i macOS oraz pobierz sterowniki Microsoft dla PHP dla SQL Server.
- Aby połączyć się z Azure SQL z uwierzytelnieniem bez hasła, zacznij od Connect z użyciem uwierzytelniania Microsoft Entra oraz opcji połączenia.
- Aby zwiększyć odporność istniejącej aplikacji na przejściowe awarie, przejdź do Idle connection resiliency i Krok 4: Nawiąż odporne połączenie z SQL przy użyciu PHP.
- Aby zdecydować między SQLSRV a PDO_SQLSRV, przejdź do Przeglądu Microsoft sterowników dla PHP for SQL Server oraz Porównania funkcji wykonawczych.
- Aby zdiagnozować problem z instalacją, połączeniem lub zapytaniem, przejdź do Rozwiązywania problemów, Obsługi błędów i ostrzeżeń oraz Logowania aktywności.
- Aby przyspieszyć istniejącą aplikację, przejdź do Performance Tuning.
Plan bazowy produkcji dla Azure SQL
Użyj tego fragmentu jako punktu wyjścia do produkcyjnego Azure SQL połączenia ze sterownikiem PDO_SQLSRV. Odczytuje serwer i bazę danych ze zmiennych środowiskowych (na przykład z ustawień aplikacji usługi Azure App Service), uwierzytelnia się przy użyciu zarządzanej tożsamości, włącza zabezpieczenia Transport Layer Security (TLS) z walidacją certyfikatu serwera, ustawia limit czasu logowania uwzględniający przełączenie awaryjne przy zimnym starcie oraz ustawia ConnectRetryCount i ConnectRetryInterval na potrzeby odporności bezczynnych połączeń SQL Server. Pomocniki connectWithRetry i queryWithRetry na poziomie aplikacji stosują ograniczony wykładniczy mechanizm ponawiania zarówno przy początkowym nawiązywaniu połączenia, jak i przy każdej instrukcji, a także rozróżniają przejściowe błędy połączenia (wymagające nowego połączenia) od przejściowych błędów zapytań (które wykorzystują ponownie to samo połączenie).
Wymaga wersji PHP 8.0 i nowszych, rozszerzenia PDO_SQLSRV oraz sterownika ODBC Microsoft dla SQL Server wersji Authentication=ActiveDirectoryMsi17.3.1.1 i nowszych. Pełną listę wartości obsługiwanych przez Authentication można znaleźć w artykule Łączenie przy użyciu uwierzytelniania Microsoft Entra.
<?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;
}
Ten fragment kodu jest przystosowany do grup pracy awaryjnej Azure SQL Database oraz Azure SQL Managed Instance.
Driver={ODBC Driver 18 for SQL Server}przypina sterownik ODBC 18. Jeśli host ma zainstalowany także ODBC 17, PDO_SQLSRV może powiązać z ODBC 17. Starsze wersje 17.x odrzucają nowszeAuthenticationwartości; na przykład wymagaAuthentication=ActiveDirectoryMsiODBC 17.3.1.1 lub nowszej wersji. Zobacz Nieprawidłowa wartość określona dla atrybutu parametry połączenia 'Authentication'.ConnectRetryCountorazConnectRetryIntervalsą słowami kluczowymi ODBC parametry połączenia, które umożliwiają odporność na połączenie w trybie idle w SQL Server: sterownik transparentnie ponownie łączy uszkodzone połączenie bezczynne. To odróżnia się od mechanizmu na poziomie aplikacjiqueryWithRetry, który ponawia próbę wykonania instrukcji, gdy kończy się ona niepowodzeniem z powodu błędu przejściowego, takiego jak zakleszczenie lub przekroczenie limitu czasu zapytania. Te dwie rzeczy się uzupełniają, więc zachowaj oba. Upewnij się, żeLoginTimeoutwynosi co najmniejConnectRetryCount * ConnectRetryInterval, aby ścieżka ponownego łączenia po bezczynności miała do dyspozycji pełny budżet czasowy; w przykładzie użyto 90 sekund, aby uwzględnić 5 × 15 sekund ponowień oraz zapas na początkowe logowanie podczas zimnego przełączenia awaryjnego.Uzupełnij wywołania na poziomie aplikacji
error_log()o diagnostykę po stronie sterownika. Dla PDO_SQLSRV ustawpdo_sqlsrv.log_severitywphp.ini(możliwe do ustawienia tylko podczas inicjalizacji); dla SQLSRV wywołajsqlsrv_configure("LogSubsystems", ...)w czasie wykonywania. Więcej informacji można znaleźć w sekcji Aktywność rejestrowa.; 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 = 1W przypadku zarządzanej tożsamości przypisanej przez użytkownika przekaż identyfikator tożsamości jako argument
$usernamePDO (new PDO($dsn, $identityId, null, $options)). Użyj identyfikatora klienta tożsamości na Azure App Service lub Azure Container Instance; w przeciwnym razie użyj identyfikatora obiektu. Sterowniki PHP dziedziczą to zachowanie po podstawowym sterowniku Microsoft ODBC dla SQL Server; więcej informacji można znaleźć w artykule Using Microsoft Entra ID with the ODBC Driver. PDO_SQLSRV odrzucaUIDwewnątrz samego DSN, więc użyj argumentu konstruktora. Przekazanienulljako użytkownika (jak w przykładzie) powoduje wybranie tożsamości zarządzanej hosta Azure przypisanej przez system. W przypadku SQLSRV (w wersji proceduralnej) przekażUIDw tablicy opcji połączenia.Ustaw
MultiSubnetFailover=true, gdy łączysz się z odbiornikiem grupy trybu failover, odbiornikiem grupy dostępności lub punktem końcowym instancji klastra trybu failover. Ustawienie tej opcji poprawia wydajność połączeń zarówno dla detektorów grup dostępności w konfiguracjach z jedną podsiecią, jak i wieloma podsieciami. Więcej informacji można znaleźć w artykule Wsparcie dla wysokiej dostępności, odbudowywanie po awarii.Aby uzyskać skalowanie odczytu lub czytelny element wtórny, dodaj
ApplicationIntent=ReadOnlydo nazwy źródła danych (DSN).W przypadku chmur suwerennych, gdzie certyfikat Subject Alternative Name (SAN) nie zawiera hosta, do którego się łączysz, dodaj
HostNameInCertificatedo DSN (na przykład*.database.usgovcloudapi.netdla Azure Government).Sterownik opiera się na podstawowym sterowniku Microsoft ODBC dla SQL Server do pozyskiwania tokenów. Tożsamość zarządzana, jednostka usługi i przepływy tokenów dostępu są obsługiwane przez ODBC. Aby uzyskać więcej informacji, zobacz Using Microsoft Entra ID with the ODBC Driver (Używanie identyfikatora Entra firmy Microsoft ze sterownikiem ODBC).
Dla wyższego bezpieczeństwa i przenośności między środowiskami zachowaj informacje o połączeniach poza kodem. Przechowuj informacje o połączeniach w systemie konfiguracji aplikacji i używaj Azure Key Vault do wartości wrażliwych oraz centralnie zarządzanych ustawień połączenia.
Równoważne połączenie SQLSRV wykorzystuje
sqlsrv_connect($server, ['Database' => $database, 'Encrypt' => true, 'Authentication' => 'ActiveDirectoryMsi', /* ... */])i zwraca zasób. Schemat powtórek jest taki sam: złapfalsepowrót zsqlsrv_connect, sprawdźsqlsrv_errors()SQLSTATE i wycofaj się przed ponowną próbą. Przykład znajdziesz w sekcji Krok 4: Niezawodne połączenie z SQL za pomocą PHP.Funkcje pomocnicze ponawiania odczytują
$e->errorInfo[1], zabezpieczone przezisset().PDOException::$errorInfojest zadeklarowane jako?arrayi domyślnie ma wartośćnull, więc sprawdzenie zabezpieczające używa domyślnie kodu sterownika0i pozwala prefiksowi SQLSTATE08zdecydować, czy ponowić próbę.
Aby uzyskać więcej informacji na temat każdej części tej konfiguracji, zobacz:
- Opcje połączenia
- Połączenie przy użyciu uwierzytelniania Microsoft Entra
- Odporność na połączenie bezczynne
- Nawiązywanie połączenia z usługą Microsoft Azure SQL Database
- Wsparcie dla wysokiej dostępności, odzyskiwania po awarii
Aby zapoznać się z wykazem błędów przejściowych Azure SQL, zobacz Rozwiązywanie problemów z przejściowymi błędami połączenia.
Kluczowe funkcje
- Dwa API, jeden pakiet sterowników: proceduralny SQLSRV dla kodu SQL Server-first lub PDO_SQLSRV dla przenośnego kodu PDO.
- Obsługa wielu platform: działa w systemach Windows, Linux i macOS dla obsługiwanych wersji PHP.
-
Połączenia szyfrowane: połączenia szyfrowane TLS przez
Encrypt=true, z walidacją certyfikatu serwera kontrolowaną przezTrustServerCertificate. - Uwierzytelnianie Microsoft Entra ID: Połączenia bezhasłowe z zarządzaną tożsamością, zasadą usługi i tokenem dostępu przepływają przez podstawowy sterownik Microsoft ODBC dla SQL Server.
- Always Encrypted: szyfrowanie po stronie klienta dla kolumn poufnych z opcjonalnymi bezpiecznymi enklawami dla operacji w miejscu.
-
Odporność połączeń: Wbudowane automatyczne ponawianie prób połączenia w stanie bezczynności z
ConnectRetryCountiConnectRetryInterval. - Strumienie PHP: Odczytuj i zapisuj duże wartości binarne i znakowe jako strumienie zamiast ładować je do pamięci.
-
Obsługa typów danych Rich SQL Server: datetimeoffset, parametry tabelowe, nvarchar oraz Unicode z .
PDO::SQLSRV_ENCODING_UTF8
Wprowadzenie
| Artykuł | Description |
|---|---|
| Wymagania systemowe | Obsługiwane wersje PHP, systemu operacyjnego oraz SQL Server. |
| Tabela obsługi | Szczegółowa matryca kompatybilności dla wydań sterowników PHP. |
| Pobierz sterowniki Microsoft dla PHP dla SQL Server | Linki do pobrania i wypuszczanie artefaktów. |
| Poradnik instalacji dla Linuksa i macOS | Zainstaluj sterownik i jego wymagania ODBC na Linuksie i macOS. |
| Ładowanie sterowników | Włącz rozszerzenia w php.ini. |
| Rozpoczęcie pracy ze sterownikiem PHP SQL | Kompletny przewodnik, który łączy cztery etapy rozpoczęcia gry. |
| Przegląd sterownika SQL PHP | Co jest w pakiecie i kiedy wybrać SQLSRV lub PDO_SQLSRV. |
Konfigurowanie i łączenie
| Artykuł | Description |
|---|---|
| Łączenie z serwerem | Otwórz połączenie z instancją SQL Server z PHP. |
| Opcje połączenia | Pełne informacje o kluczach kluczowych połączenia, domyślnych ustawieniach i sposobach ich ustawiania. |
| Nawiązywanie połączenia z usługą Microsoft Azure SQL Database | Połącz aplikację PHP z bazą danych Azure SQL Database. |
| Połącz się na określonym porcie | Wskaż niestandardowy port TCP. |
| Buforowanie połączeń | Ponownie wykorzystaj połączenia ODBC na żądaniach PHP. |
| Wyłącz wiele aktywnych zestawów wyników (MARS) | Wyłącz MARS dla kompatybilności. |
| Obsługa bazy danych LocalDB | Połącz się z instancją SQL Server LocalDB. |
| Wsparcie dla wysokiej dostępności, odzyskiwania po awarii | Nasłuchiwacze grup dostępności i przełączanie awaryjne w wielu podsieciach. |
| Odporność na połączenie bezczynne | Automatyczne ponowne łączenie zerwanych nieaktywnych połączeń. |
Authenticate
| Artykuł | Description |
|---|---|
| Połączenie przy użyciu uwierzytelniania Microsoft Entra | Przepływy zarządzanej tożsamości, jednostki usługi, tokenu dostępu i hasła. |
| Połącz się za pomocą uwierzytelniania SQL Server | Użyj logowania SQL z nazwą użytkownika i hasłem. |
| Połącz się za pomocą Windows authentication | Korzystaj z uwierzytelniania zintegrowanego z Windows na hostach dołączonych do domeny. |
Secure
| Artykuł | Description |
|---|---|
| Zagadnienia związane z zabezpieczeniami | Model zagrożeń i szczegółowe wskazówki dotyczące obrony dla aplikacji PHP. |
| Zawsze szyfrowane sterownikami PHP | Skonfiguruj szyfrowanie po stronie klienta dla kolumn poufnych. |
| Ciągłe Szyfrowanie z bezpiecznymi enklawami | Włącz zaawansowane operacje na zaszyfrowanych kolumnach przy użyciu bezpiecznych enklaw. |
Pobieranie i aktualizacja danych
| Artykuł | Description |
|---|---|
| Przewodnik programowy | Kompleksowy przewodnik programowania dla obu sterowników. |
| Porównywanie funkcji wykonawczych | Wybierz odpowiednią funkcję wykonawczą dopasowaną do swojego obciążenia. |
| Bezpośrednie wykonywanie instrukcji oraz wykonywanie przygotowanych instrukcji (PDO_SQLSRV) | Kiedy stosować bezpośrednie wykonanie, a kiedy przygotowane oświadczenia. |
| Pobieranie danych | Pobieraj wiersze, kolumny i wartości przesyłane strumieniowo. |
| Aktualizacja danych | Wstaw, aktualizuj i usuń wiersze. |
| Wykonuj zapytania parametryzowane | Powiąż parametry, aby zabezpieczyć się przed wstrzyknięciem SQL. |
| Wysyłaj dane jako strumień | Przesyłaj duże wartości binarne i znakowe do SQL Server. |
| Wykonywanie transakcji | Grupuj wypowiedzi w transakcje atomowe. |
| Użyj parametrów tabelowych | Przekaż TABLE parametr do procedury przechowywanej. |
| Określ typ kursora i wybierz wiersze | Wybierz kursory przewijane tylko do przodu, statyczne, dynamiczne lub oparte na kluczu. |
Typy danych
| Artykuł | Description |
|---|---|
| Konwersja typów danych | Jak sterownik mapuje typy PHP na typy SQL Server. |
| Domyślne typy danych SQL Server | Domyślny typ SQL Server dla każdej wartości PHP. |
| Domyślne typy danych PHP | Domyślny typ PHP dla każdego typu kolumny SQL Server. |
| Określ typy danych SQL Server (SQLSRV) | Zastąp typ SQL Server podczas wiązania parametrów. |
| Określ typy danych PHP | Nadpisuj typ PHP podczas pobierania. |
| Wysyłanie i pobieranie danych UTF-8 | Użyj PDO::SQLSRV_ENCODING_UTF8 do konwersji Unicode w obie strony. |
| Wysyłanie i pobieranie danych ASCII na Linuksie i macOS | Obsługuję połączenia ASCII w obie strony na hostach innych niż Windows. |
| Formatowanie liczb dziesiętnych i wartości pieniężnych (SQLSRV) | Sformatuj kolumny dziesiętne i pieniężne za pomocą sterownika SQLSRV. |
| Formatuj liczby dziesiętne i kwoty pieniężne (PDO_SQLSRV) | Formatuj kolumny decimal i money za pomocą sterownika PDO_SQLSRV. |
| Ustawienia lokalizacji niezwiązane z systemem | Lokalne separatory dziesiętne i inne uwarunkowania regionalne. |
Błędy i diagnostyka
| Artykuł | Description |
|---|---|
| Błędy i ostrzeżenia dotyczące obsługi | Obsługa błędów i ostrzeżeń w obu sterownikach. |
| Konfiguracja obsługi błędów i ostrzeżeń (SQLSRV) | Dostosuj sposób, w jaki sterownik SQLSRV zgłasza błędy i ostrzeżenia. |
| Obsługa błędów i ostrzeżeń (SQLSRV) | Inspekcja błędów zwracanych przez funkcje SQLSRV. |
| Działalność logowania | Włącz logowanie sterowników w celu przechwytywania danych diagnostycznych. |
Wdrażanie i obsługa
| Artykuł | Description |
|---|---|
| Dostrajanie wydajności | Zarządzanie połączeniami, grupowanie, przygotowane instrukcje, kursory, pamięć oraz monitorowanie po stronie serwera. |
| Troubleshooting | Zdiagnozuj typowe problemy z instalacją, połączeniem, zapytaniem, typem danych, transakcją i kontenerem. |
Zawartość referencyjna
| Artykuł | Description |
|---|---|
| SQLSRV driver API reference | Wszystkie sqlsrv_* funkcje, parametry i wartości zwracane. |
| Dokumentacja sterownika PDO_SQLSRV | Metody PDO i PDOStatement obsługiwane przez sterownik PDO_SQLSRV. |
| stałe | Stałe ujawniane przez sterowniki, w tym stałe typu i kodowania. |
Zadania powiązane
| Artykuł | Description |
|---|---|
| Informacje o wydaniu | Historia każdej wersji z nowymi funkcjami, poprawkami błędów, zmianami wsparcia platformy i linkami do pobrania. |
| O przykładach kodu w dokumentacji | Konwencje stosowane przez przykłady kodu w tej sekcji. |
| Przykłady kodu sterownika PHP SQL | Przykładowe aplikacje end-to-end dla SQLSRV i PDO_SQLSRV. |
| Zasoby wsparcia | Społeczność i kanały wsparcia. |