Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Драйверы 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. |
| Поддерживающие ресурсы | Сообщество и каналы поддержки. |