Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Драйверы Microsoft для PHP для SQL Server — это расширения PHP, которые можно использовать для чтения и записи данных в Microsoft SQL ядро СУБД из PHP-скриптов. Оба расширения используют один и тот же драйвер Microsoft ODBC для SQL Server, но предлагают разные PHP-API и параметры, специфичные для драйверов:
-
SQLSRV предоставляет процедурный API (
sqlsrv_*функции), адаптированный к функциям SQL Server. - PDO_SQLSRV реализует интерфейс PHP Data Objects (PDO). Вы можете оставить вызовы PDO в существующем коде базы данных, но перед сменой базы данных проверьте запросы в нём и настройки драйвера.
Оба драйвера подключаются к База данных SQL Azure, SQL Database в Microsoft Fabric, Управляемый экземпляр SQL Azure и SQL Server всех поддерживаемых версий и редакций, включая редакции Express. Оба драйвера принимают потоки PHP в качестве входных параметров. SQLSRV поддерживает получение больших бинарных и символьных значений в виде потоков. Не думайте, что у PDO_SQLSRV такое же поведение при потоковом выводе.
Выберите начальную точку
- Чтобы проверить установку и выполнить параметризованный запрос с помощью SQLSRV или PDO_SQLSRV, начните с Краткое руководство: подключение и выполнение запросов с помощью драйверов Microsoft для PHP.
- Чтобы установить драйвер на Linux или macOS, начните с учебника по установке Linux и macOS и скачайте драйверы Microsoft для PHP for SQL Server.
- Чтобы подключиться к Azure SQL с помощью беспарольной аутентификации, начните с Подключение с помощью аутентификации Microsoft Entra и Параметры подключения.
- Чтобы сделать существующее приложение устойчивым к временным сбоям, перейдите в раздел Idle connection resilienc.
- Чтобы выбрать между SQLSRV и PDO_SQLSRV, перейдите в разделы «Обзор Microsoft драйверов для PHP для SQL Server» и «Сравнение функций исполнения».
- Чтобы диагностировать проблему установки, соединения или запроса, перейдите в разделы «Устранение неполадок», «Обработка ошибок и предупреждений» и «Ведение журнала».
- Чтобы ускорить существующее приложение, перейдите в раздел настройки производительности.
Производственные базовые показатели для Azure SQL
Этот пример PDO_SQLSRV считывает сервер и базу данных из переменных среды и соединяется с управляемой идентификацией. Он формирует имя источника данных (DSN) и поддерживает систему безопасности транспортного уровня (TLS) с валидацией сертификатов. Читайте эти значения из доверенной конфигурации приложения, а не из параметров веб-запроса. Запустите программу на хосте с конечной точкой управляемой идентификации после предоставления этой идентификации доступа к базе данных.
Вспомогательные функции делают до трёх попыток подключиться или выполнить запрос только для чтения при возникновении одной из перечисленных ошибок. Они ждут дольше между попытками — это паттерн повтора, называемый экспоненциальным отступлением. Если ошибка запроса требует нового соединения, помощник запроса выдает исключение для обработки вызывающего кода.
Используйте поддерживаемую версию PHP, расширение PDO_SQLSRV и Microsoft ODBC Driver 18 для SQL Server. Для поддерживаемых значений аутентификации см. раздел 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];
// 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;
}
Используйте эти настройки для групп отработки отказа База данных SQL Azure и Управляемый экземпляр SQL Azure.
Driver={ODBC Driver 18 for SQL Server}выбирает ODBC Driver 18 явно, а не полагается на обнаружение драйверов. Установите его перед запуском примера.Установите
SQL_DATABASEна фактическое имя базы данных. Программа удваивает закрывающие скобки и заключает имя в фигурные скобки перед размещением в DSN. Escapeing не даёт особым символам в названии изменить то, как драйвер считывает настройки соединения.ConnectRetryCountиConnectRetryIntervalуправляют устойчивостью неактивного подключения ODBC. Тайм-аут запроса в команде ограничивает восстановление во время выполнения. С 30-секундным тайм-аутом запроса ODBC может остановиться, не исчерпав все пять попыток повторного подключения.LoginTimeout=90Контролирует установление соединения, а не бюджет восстановления. Помощник на уровне приложения повторяет выбранные ошибки сервера; он не повторяет тайм-аут запроса и не воспроизводит частично полученные результаты.Включите логирование драйверов вместе с вызовами
error_log()программы. Для PDO_SQLSRV — действиеpdo_sqlsrv.log_severityпроисходит воphp.iniвремя выполнения или сini_set()ним. Для SQLSRV настройтеLogSeverityиLogSubsystemsсsqlsrv_configure(). Для получения дополнительной информации см. раздел «Активность логирования».; 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 вместо встраивания имени пользователя в DSN. Передачаnullв качестве пользователя (как в примере) приводит к выбору управляемого удостоверения, назначенного системой, для узла Azure. Для SQLSRV (процедурного) передайтеUIDмассив опций соединения.Задайте значение
MultiSubnetFailover=trueпри подключении к прослушивателю группы отработки отказа, прослушивателю группы доступности или конечной точке экземпляра отказоустойчивого кластера. Включение этого параметра повышает производительность подключения как для слушателей групп доступности с одной подсетью, так и для слушателей групп доступности с несколькими подсетями. Для получения дополнительной информации см. раздел «Поддержка высокой доступности, восстановление после катастроф».Для горизонтального масштабирования чтения или доступной для чтения вторичной реплики добавьте
ApplicationIntent=ReadOnlyв DSN.Используйте конечную точку, предоставляемую вашим SQL-сервисом, включая его облачно-специфическую область. Исследуйте несоответствия имён сертификатов, а не отключайте проверку сертификатов. Используйте
HostNameInCertificateтолько тогда, когда знаете ожидаемое имя сертификата для этой конечной точки.ODBC получает токены для управляемой идентичности и аутентификации субъекта-службы. С
AccessTokenпомощью , ваше приложение получает токен и передаёт его водителю; ODBC не приобретает его за вас. Дополнительные сведения см. в разделе Использование Microsoft Entra ID с драйвером ODBC.Храните данные о подключении отдельно от кода. Храните его в конфигурационной системе вашего приложения и используйте Azure Key Vault для секретов.
С помощью SQLSRV задайте параметры соединения в массиве, передаваемые в
sqlsrv_connect(). Проверьте наличие обратногоfalseи осмотритеsqlsrv_errors()её, прежде чем решать, стоит ли пробовать снова. Устанавливайте тайм-ауты операторов отдельно с помощьюQueryTimeout. Устойчивость соединения в простое демонстрирует повторное подключение ODBC, а не повторный цикл на уровне приложения.Вспомогательные функции повторных попыток считывают
$e->errorInfo[1]под защитойisset().PDOException::$errorInfoобъявляется как?arrayи по умолчанию имеет значениеnull, поэтому защитная проверка возвращается к коду драйвера0и позволяет префиксу SQLSTATE08решать, следует ли повторить попытку.
Дополнительные сведения о каждой части этой конфигурации см. в следующей статье:
- Параметры подключения
- Подключитесь, используя аутентификацию Microsoft Entra
- Устойчивость к простою соединения
- Подключение к базе данных Microsoft Azure SQL
- Поддержка высокой доступности, восстановления после катастроф
Каталог временных ошибок Azure SQL см. в разделе "Устранение временных ошибок подключения".
Ключевые особенности
- Два PHP-API: SQLSRV предоставляет процедурные функции. PDO_SQLSRV реализует PDO. Установите либо расширение, либо оба варианта.
- Поддержка широкой платформы: работает на Windows, Linux и macOS с поддерживаемыми версиями PHP.
-
Зашифрованные соединения: TLS-шифрованные соединения через
Encrypt=true, при этом проверка серверного сертификата контролируетсяTrustServerCertificate. -
Аутентификация Microsoft Entra ID: Управляемые удостоверения, субъект-служба и внешне полученные токены доступа через базовый драйвер Microsoft ODBC для SQL Server. Управляемое удостоверение не использует пароли;
ActiveDirectoryServicePrincipalиспользует клиентский секрет. - Always Encrypted: Шифруйте чувствительные столбцы на клиенте с защищёнными анклавами для поддерживаемых операций с зашифрованными данными.
-
Устойчивость соединения: встроенные повторные попытки для неактивных подключений с
ConnectRetryCountиConnectRetryInterval. - PHP-потоки: Отправляйте большие бинарные и символьные значения из параметров потока через любой из API. Используйте SQLSRV для потокового извлечения.
-
Широкая поддержка типов данных 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. |
| Быстрый старт: подключитесь и отправьте запросы с помощью драйверов Microsoft для PHP | Проверьте расширения, настройте соединение и выполните тот же параметризованный запрос с помощью SQLSRV или PDO_SQLSRV. |
| Обзор 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 или Kerberos на Linux и macOS. |
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 | Задайте опцию CharacterSet SQLSRV или атрибут PDO::SQLSRV_ATTR_ENCODING PDO_SQLSRV. |
| Отправка и извлечение 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. |
| Поддерживающие ресурсы | Сообщество и каналы поддержки. |
Запрашивание функции
Чтобы запросить новую функцию, создайте запрос в репозитории Microsoft Drivers for PHP for SQL Server GitHub repository.