Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Драйверы Microsoft для PHP for SQL Server — это расширения для PHP, которые позволяют читать и записывать данные в Microsoft SQL ядро СУБД из PHP-скриптов. Пакет поставляется с двумя драйверами, которые используют один и тот же драйвер Microsoft ODBC для SQL Server и используют одинаковые варианты подключения, так что вы можете выбрать API, подходящий для вашей кодовой базы:
-
SQLSRV предоставляет процедурный API (
sqlsrv_*функции), адаптированный к функциям SQL Server. - PDO_SQLSRV реализует интерфейс PHP Data Objects (PDO), поэтому код, уже использующий PDO для других баз данных, может таргетировать SQL Server с минимальными изменениями.
Оба драйвера подключаются к База данных SQL Azure, SQL Database в Microsoft Fabric, Управляемый экземпляр SQL Azure, а также со всеми поддерживаемыми версиями и редакциями SQL Server (включая версии Express). Они используют потоки PHP для передачи больших бинарных и символьных значений без полной загрузки их в память.
Выберите начальную точку
- Чтобы настроить среду разработки на PHP и выполнить первый запрос, начните с Шага 1: Настройте среду разработки, затем шаг 2: Создайте базу данных SQL и шаг 3: Доказательство концепции подключения к SQL с помощью PHP.
- Чтобы установить драйвер на Linux или macOS, начните с учебника по установке Linux и macOS и скачайте драйверы Microsoft для PHP for SQL Server.
- Чтобы подключиться к Azure SQL с помощью беспарольной аутентификации, начните с Подключение с помощью аутентификации Microsoft Entra и Параметры подключения.
- Чтобы сделать существующее приложение устойчивым к временным сбоям, перейдите в раздел « Устойчивость соединения при простое » и шаг 4: Устойчивое подключение к SQL с PHP.
- Чтобы выбрать между SQLSRV и PDO_SQLSRV, перейдите в разделы «Обзор Microsoft драйверов для PHP для SQL Server» и «Сравнение функций исполнения».
- Чтобы диагностировать проблему установки, соединения или запроса, перейдите в разделы «Устранение неполадок», «Обработка ошибок и предупреждений» и «Ведение журнала».
- Чтобы ускорить существующее приложение, перейдите в раздел настройки производительности.
Производственные базовые показатели для Azure SQL
Используйте этот фрагмент как отправную точку для производственного Azure SQL соединения с драйвером PDO_SQLSRV. Он считывает сервер и базу данных из переменных среды (например, из настроек приложения Служба приложений Azure), выполняет аутентификацию с помощью управляемой идентификации, включает безопасность транспортного уровня (TLS) с проверкой сертификата сервера, задаёт тайм-аут входа, достаточный для переключения при холодном запуске, и задаёт ConnectRetryCount и ConnectRetryInterval для устойчивости неактивных подключений SQL Server. Вспомогательные функции уровня приложения connectWithRetry и queryWithRetry применяют к начальному подключению и к каждому запросу ограниченную экспоненциальную задержку между повторами, а также отделяют временные ошибки подключения (требующие нового соединения) от временных ошибок запроса (при которых используется то же соединение).
Требуется версии PHP 8.0 и более поздние, расширение PDO_SQLSRV и драйвер Microsoft ODBC для версий SQL Server 17.3.1.1 и более поздних версий для Authentication=ActiveDirectoryMsi. Полный список поддерживаемых Authentication значений см. раздел «Подключение с помощью аутентификации 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;
}
Этот фрагмент предназначен для групп автоматического переключения База данных SQL Azure и Управляемый экземпляр SQL Azure.
Driver={ODBC Driver 18 for SQL Server}закрепляет драйвер ODBC 18. Если на хосте также установлен ODBC 17, PDO_SQLSRV может привязаться к ODBC 17. Старые сборки 17.x отклоняют новыеAuthenticationзначения; например,Authentication=ActiveDirectoryMsiтребуется ODBC 17.3.1.1 или более поздняя версия. См. значение Invalid, указанное для атрибута строка подключения 'Authentication'.ConnectRetryCountиConnectRetryIntervalявляются ключевыми словами ODBC строка подключения, которые обеспечивают устойчивость SQL Server к бездействующему соединению: драйвер прозрачно переподключает сломанное соединение в режиме простоя. Это отличается от механизмаqueryWithRetryна уровне приложения, который повторно выполняет инструкцию, завершившуюся сбоем из-за временной ошибки, например взаимоблокировки или превышения времени ожидания запроса. Эти два варианта дополняют друг друга, так что оставьте оба. Убедитесь, чтоLoginTimeoutсоставляет не менееConnectRetryCount * ConnectRetryInterval, чтобы сценарий переподключения в режиме простоя получил весь отведённый ему бюджет времени; в примере используется 90 секунд, чтобы учесть 5 × 15 секунд повторных попыток плюс запас для первоначального входа в систему при холодном переключении на резерв.Дополняйте вызовы на уровне
error_log()приложений драйверской диагностикой. Для PDO_SQLSRV установитеpdo_sqlsrv.log_severityвphp.ini(можно установить только при инициализации); для SQLSRV вызовитеsqlsrv_configure("LogSubsystems", ...)во время выполнения. Для получения дополнительной информации см. раздел «Активность логирования».; 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 = 1Для управляемой идентификации, назначаемой пользователем передайте идентификатор этой идентификации в качестве аргумента
$usernamePDO (new PDO($dsn, $identityId, null, $options)). Используйте клиентский идентификатор идентичности в Служба приложений Azure или Azure Container Instance; в противном случае используйте его объектный идентификатор. Драйверы PHP наследуют это поведение от базового драйвера Microsoft ODBC для SQL Server; для получения дополнительной информации см. раздел «Использование Microsoft Entra ID с драйвером ODBC». PDO_SQLSRV отвергаетUIDв самой строке DSN, поэтому используйте параметр конструктора. Передачаnullв качестве пользователя (как в примере) приводит к выбору управляемого удостоверения, назначенного системой, для узла Azure. Для SQLSRV (процедурного) передайтеUIDмассив опций соединения.Задайте значение
MultiSubnetFailover=trueпри подключении к прослушивателю группы отработки отказа, прослушивателю группы доступности или конечной точке экземпляра отказоустойчивого кластера. Включение этого параметра повышает производительность подключения как для слушателей групп доступности с одной подсетью, так и для слушателей групп доступности с несколькими подсетями. Для получения дополнительной информации см. раздел «Поддержка высокой доступности, восстановление после катастроф».Для масштабирования чтения или читаемого вторичного элемента добавьте
ApplicationIntent=ReadOnlyк названию источника данных (DSN).Для суверенных облаков, где сертификат Subject Alternative Name (SAN) не включает хост, к которому вы подключаетесь, добавьте
HostNameInCertificateэто в DSN (например,*.database.usgovcloudapi.netдля Azure для государственных организаций).Драйвер основан на базовом драйвере Microsoft ODBC для SQL Server для получения токенов. Управляемые потоки идентичности, принципа сервиса и токена доступа проходят через ODBC. Дополнительные сведения см. в разделе Использование Microsoft Entra ID с драйвером ODBC.
Для повышения безопасности и портативности между окружениями храните информацию о соединении вне вашего кода. Храните информацию о соединениях в системе конфигурации вашего приложения и используйте Azure Key Vault для чувствительных значений и централизованно управляемых настроек соединения.
Эквивалентное соединение SQLSRV использует
sqlsrv_connect($server, ['Database' => $database, 'Encrypt' => true, 'Authentication' => 'ActiveDirectoryMsi', /* ... */])и возвращает ресурс. Схема повторных попыток та же: обработать возвратfalseотsqlsrv_connect, проверить SQLSTATE вsqlsrv_errors()и выждать паузу перед повторной попыткой. Для отработанного примера см. Шаг 4: Устойчивое подключение к SQL с помощью PHP.Вспомогательные функции повторных попыток считывают
$e->errorInfo[1]под защитойisset().PDOException::$errorInfoобъявляется как?arrayи по умолчанию имеет значениеnull, поэтому защитная проверка возвращается к коду драйвера0и позволяет префиксу SQLSTATE08решать, следует ли повторить попытку.
Дополнительные сведения о каждой части этой конфигурации см. в следующей статье:
- Параметры подключения
- Подключитесь, используя аутентификацию Microsoft Entra
- Устойчивость к простою соединения
- Подключение к базе данных Microsoft Azure SQL
- Поддержка высокой доступности, восстановления после катастроф
Каталог временных ошибок Azure SQL см. в разделе "Устранение временных ошибок подключения".
Ключевые особенности
- Два API, один драйверный пакет: процедурный SQLSRV для SQL Server-первого кода или PDO_SQLSRV для портативного PDO-кода.
- Поддержка широкой платформы: работает на Windows, Linux и macOS с поддерживаемыми версиями PHP.
-
Зашифрованные соединения: TLS-шифрованные соединения через
Encrypt=true, при этом проверка серверного сертификата контролируетсяTrustServerCertificate. - Аутентификация Microsoft Entra ID: Безпарольные соединения с управляемой идентификацией, принципом сервиса и токена доступа, проходящими через базовый драйвер Microsoft ODBC для SQL Server.
- Always Encrypted: шифрование на стороне клиента для конфиденциальных столбцов с необязательными безопасными анклавами для операций на месте.
-
Устойчивость соединения: встроенные повторные попытки для неактивных подключений с
ConnectRetryCountиConnectRetryInterval. - PHP-потоки: читать и записывать большие бинарные и символьные значения в виде потоков вместо загрузки их в память.
-
Широкая поддержка типов данных SQL Server: datetimeoffset, табличные параметры, nvarchar и Unicode с
PDO::SQLSRV_ENCODING_UTF8.
Get started
| Статья | Description |
|---|---|
| Требования к системе | Поддерживаются версии PHP, операционной системы и SQL Server. |
| Матрица поддержки | Подробная матрица совместимости для выпусков драйверов PHP. |
| Скачайте драйверы Microsoft для PHP для SQL Server | Ссылки для скачивания и файлы релиза. |
| Учебник по установке Linux и macOS | Установите драйвер и его требования ODBC на Linux и macOS. |
| Загрузка драйверов | Включите расширения в php.ini. |
| Начало работы с драйвером PHP SQL | Сквозное пошаговое руководство, объединяющее четыре шага для начала работы. |
| Обзор PHP-драйвера SQL | Что входит в комплект и когда выбирать SQLSRV или PDO_SQLSRV. |
Настройка и подключение
| Статья | Description |
|---|---|
| Подключение к серверу | Откройте подключение к экземпляру SQL Server из PHP. |
| Параметры подключения | Полный справочник по ключевым словам соединения, значениям по умолчанию и их установке. |
| Подключение к базе данных Microsoft Azure SQL | Подключите PHP-приложение к База данных SQL Azure. |
| Подключитесь к заданному порту | Нацеливайтесь на нестандартный TCP-порт. |
| Организация пулов соединений | Повторное использование ODBC-соединений во всех PHP-запросах. |
| Отключить несколько активных наборов результатов (MARS) | Отключите MARS для совместимости. |
| Поддержка LocalDB | Подключитесь к экземпляру SQL Server LocalDB. |
| Поддержка высокой доступности, восстановления после катастроф | Прослушиватели групп доступности и отработка отказа в нескольких подсетях. |
| Устойчивость к простою соединения | Автоматическое повторное подключение при прерванных холостых соединениях. |
Authenticate
| Статья | Description |
|---|---|
| Подключитесь, используя аутентификацию Microsoft Entra | Управляемая идентификация, субъект-служба, маркер доступа и потоки с паролем. |
| Подключитесь с помощью аутентификации SQL Server | Используйте SQL-логин с именем пользователя и паролем. |
| Подключитесь с помощью проверка подлинности Windows | Используйте интегрированную аутентификацию Windows на хостах, связанных с доменом. |
Secure
| Статья | Description |
|---|---|
| Вопросы безопасности | Модель угроз и глубокое руководство по защите для PHP-приложений. |
| Всегда шифруется с драйверами PHP | Настройте шифрование на стороне клиента для конфиденциальных столбцов. |
| Всегда зашифровано с безопасными анклавами | Обеспечьте выполнение расширенных операций с зашифрованными столбцами с использованием защищённых анклавов. |
Получение и обновление данных
| Статья | Description |
|---|---|
| Руководство по программированию | Сквозное руководство по программированию для обоих драйверов. |
| Сравнение функций исполнения | Выберите правильную функцию выполнения для вашей нагрузки. |
| Прямое и подготовленное выполнение заявления (PDO_SQLSRV) | Когда использовать прямое исполнение по сравнению с подготовленными заявлениями. |
| Извлечение данных | Получайте строки, столбцы и потоковые значения. |
| Обновление данных | Вставлять, обновлять и удалять строки. |
| Выполняйте параметризованные запросы | Привязать параметры для защиты от SQL-инъекции. |
| Отправляйте данные в виде потока | Транслируйте большие бинарные и символьные значения в SQL Server. |
| Выполнять транзакции | Сгруппируйте операторы в атомарные транзакции. |
| Использование параметров с таблицными значениями | Передайте TABLE параметр сохранённой процедуре. |
| Закажите тип курсора и выберите строки | Выберите курсоры только вперёд, статические, динамические или клавишные курсоры. |
Типы данных
| Статья | Description |
|---|---|
| Преобразование типов данных | Как драйвер сопоставляет типы PHP на типы SQL Server. |
| Типы данных по умолчанию на SQL Server | Тип SQL Server по умолчанию для каждого значения PHP. |
| Стандартные типы данных PHP | Стандартный тип PHP для каждого типа столбца SQL Server. |
| Укажите типы данных SQL Server (SQLSRV) | Переопределите тип SQL Server при привязке параметров. |
| Укажите типы данных PHP | Переопределите тип PHP при извлечении. |
| Отправка и извлечение данных UTF-8 | Используйте PDO::SQLSRV_ENCODING_UTF8 для поездок с Unicode туда и обратно. |
| Отправка и извлечение ASCII-данных на Linux и macOS | Обрабатывайте ASCII туда и обратно на не-Windows-хостах. |
| Форматирование десятичных знаков и денег (SQLSRV) | Форматируйте десятичные и денежные столбцы с помощью драйвера SQLSRV. |
| Форматирование десятичных чисел и денежных значений (PDO_SQLSRV) | Форматируйте десятичные и денежные столбцы с помощью драйвера PDO_SQLSRV. |
| Настройки локальности вне системы | Локализованные десятичные сепараторы и другие особенности местоположения. |
Ошибки и диагностика
| Статья | Description |
|---|---|
| Обработка ошибок и предупреждений | Обработка ошибок и предупреждений для обоих драйверов. |
| Настройка обработки ошибок и предупреждений (SQLSRV) | Настройте то, как драйвер SQLSRV сообщает об ошибках и предупреждениях. |
| Обработка ошибок и предупреждений (SQLSRV) | Проверьте ошибки, возвращаемые функциями SQLSRV. |
| Журналирование активности | Включите логирование драйверов для диагностического захвата. |
Развертывание и эксплуатация
| Статья | Description |
|---|---|
| Настройка производительности | Управление соединениями, пакетирование, подготовленные выражения, курсоры, память и мониторинг на стороне сервера. |
| Troubleshooting | Диагностируйте распространённые проблемы с установкой, подключением, запросом, типом данных, транзакциями и контейнерами. |
Справочные материалы
| Статья | Description |
|---|---|
| Ссылка на API драйвера SQLSRV | Все sqlsrv_* функции, параметры и возвратные значения. |
| Справочник по драйверу PDO_SQLSRV | Методы PDO и PDOStatement, поддерживаемые драйвером PDO_SQLSRV. |
| Константы | Константы, представленные драйверами, включая константы типов и кодирования. |
Связанные задачи
| Статья | Description |
|---|---|
| Заметки о выпуске | История каждой версии с новыми функциями, исправлениями ошибок, изменениями поддержки платформы и ссылками на скачивания. |
| О образцах кода в документации | Конвенции, используемые в образцах кода в этом разделе. |
| Примеры кода для PHP-SQL-драйвера | Полнофункциональные примеры приложений для SQLSRV и PDO_SQLSRV. |
| Поддерживающие ресурсы | Сообщество и каналы поддержки. |