Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Os drivers Microsoft para PHP para SQL Server são extensões PHP que você pode usar para ler e gravar dados no Microsoft SQL Mecanismo de Banco de Dados a partir de scripts PHP. As duas extensões usam o mesmo driver Microsoft ODBC para SQL Server, mas oferecem APIs PHP diferentes e opções específicas de driver:
-
O SQLSRV expõe uma API procedural (
sqlsrv_*funções) adaptada para recursos do SQL Server. - PDO_SQLSRV implementa a interface PHP Data Objects (PDO ). Você pode manter as chamadas PDO no código do banco de dados existente, mas revise suas consultas e configurações específicas do driver antes de trocar de banco de dados.
Ambos os drivers se conectam ao Banco de Dados SQL do Azure, SQL Database no Microsoft Fabric, Instância Gerenciada de SQL do Azure e todas as versões e edições suportadas do SQL Server, incluindo as edições Express. Ambos os drivers aceitam fluxos PHP como parâmetros de entrada. O SQLSRV suporta a recuperação de grandes valores binários e de caracteres como fluxos. Não presuma PDO_SQLSRV tem o mesmo comportamento de streaming de saída.
Escolha o ponto de partida
- Para verificar sua instalação e executar uma consulta parametrizada usando SQLSRV ou PDO_SQLSRV, comece com Quickstart: Connect e consulte com os drivers Microsoft para PHP.
- Para instalar o driver no Linux ou macOS, comece pelo tutorial de Instalação para Linux e macOS e baixe os drivers da Microsoft para PHP para SQL Server.
- Para se conectar ao SQL do Azure com autenticação sem senha, comece com Conectar-se usando a autenticação do Microsoft Entra e Opções de conexão.
- Para tornar um app existente resistente a falhas transitórias, vá para Idle connection resiliency.
- Para decidir entre SQLSRV e PDO_SQLSRV, acesse Visão Geral dos Microsoft Drivers para PHP para SQL Server e Comparando funções de execução.
- Para diagnosticar um problema de instalação, conexão ou consulta, vá em Solução de Problemas, Gerenciamento de erros e avisos, e Atividade de log.
- Para tornar um app já existente mais rápido, vá para Performance Tuning.
Linha de base de produção para SQL do Azure
Este PDO_SQLSRV exemplo lê o servidor e o banco de dados a partir de variáveis de ambiente e conecta-se com uma identidade gerenciada. Ele constrói um nome de fonte de dados (DSN) e habilita a Segurança da Camada de Transporte (TLS) com validação de certificados. Leia esses valores a partir da configuração confiável da aplicação, não dos parâmetros de requisição web. Execute o programa em um host com um endpoint de identidade gerenciada após conceder acesso à identidade ao banco de dados.
As funções auxiliares tentam conectar-se ou executar a consulta somente leitura em até três tentativas quando ocorre um erro listado. Eles esperam mais entre as tentativas, um padrão de retentativa chamado recuo exponencial. Se um erro de consulta exigir uma nova conexão, o assistente de consulta lança a exceção para que o código que chama seja gerenciado.
Use uma versão de PHP suportada, a extensão PDO_SQLSRV e Microsoft ODBC Driver 18 para SQL Server. Para valores de autenticação suportados, veja Connect usando autenticação Microsoft Entra. Não reutilize o auxiliar de consulta para escritas ou transações com múltiplas instruções sem projetar uma política de retentativa específica para cada aplicação: um erro nem sempre indica se uma escrita foi commitada.
<?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;
}
Use estas configurações para grupos de failover do Banco de Dados SQL do Azure e Instância Gerenciada de SQL do Azure.
Driver={ODBC Driver 18 for SQL Server}seleciona explicitamente o Driver ODBC 18 em vez de depender da descoberta do driver. Instale-o antes de rodar o exemplo.Defina
SQL_DATABASEpara o nome real do banco de dados. O programa dobra as chaves de fechamento e envolve o nome em chaves antes de colocá-lo na DSN. Escapar impede que caracteres especiais no nome alterem a forma como o driver lê as configurações de conexão.ConnectRetryCounteConnectRetryIntervalcontrole da resiliência da conexão ODBC em inatividade. O tempo limite da consulta do comando SQL limita a recuperação durante a execução. Com o tempo de consulta de 30 segundos da amostra, o ODBC pode parar antes de esgotar todas as cinco tentativas de reconexão.LoginTimeout=90controla o estabelecimento da conexão, não o orçamento de recuperação. O helper em nível de aplicação tenta novamente após erros selecionados do servidor; ele não tenta novamente um timeout de consulta nem reapresenta resultados parcialmente obtidos.Ative o registro de motoristas junto com as chamadas do
error_log()programa. Para PDO_SQLSRV, configurepdo_sqlsrv.log_severityemphp.iniou comini_set()em tempo de execução. Para SQLSRV, configureLogSeverityeLogSubsystemscomsqlsrv_configure(). Para mais informações, veja Atividade de registro.; 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 = 1Para uma identidade gerenciada atribuída pelo usuário, passe o ID da identidade como argumento
$usernamedo PDO (new PDO($dsn, $identityId, null, $options)). Use o ID do cliente da identidade no Serviço de Aplicativo do Azure ou Instância de Contêiner do Azure; caso contrário, use seu ID do objeto. Os drivers PHP herdam esse comportamento do driver Microsoft ODBC para SQL Server; para mais informações, veja Usando o Microsoft Entra ID com o driver ODBC. Use o argumento de nome de usuário do construtor PDO em vez de incorporar o nome de usuário ao DSN. Passarnullcomo o usuário (como o exemplo faz) seleciona a identidade gerenciada atribuída pelo sistema do host do Azure. Para SQLSRV (procedural), passeUIDno array de opções de conexão.Defina
MultiSubnetFailover=trueao se conectar a um listener de grupo de failover, listener de grupo de disponibilidade ou ponto de extremidade de instância de cluster de failover. Definir isso melhora o desempenho da conexão para listeners de grupo de disponibilidade de sub-rede única e de várias sub-redes. Para mais informações, veja Suporte para Alta Disponibilidade, recuperação de desastres.Para leitura escalonada ou um secundário legível, adicione
ApplicationIntent=ReadOnlyà DSN.Use o endpoint fornecido pelo seu serviço SQL, incluindo seu domínio específico para a nuvem. Investigue incompatibilidades entre nomes de certificados em vez de desativar a validação de certificados. Use
HostNameInCertificateapenas quando você souber o nome esperado do certificado para esse endpoint.O ODBC adquire tokens para identidade gerenciada e autenticação de principal de serviço. Com
AccessToken, seu aplicativo adquire o token e o passa para o driver; O ODBC não o adquire para você. Para obter mais informações, consulte Usar o Microsoft Entra ID com o driver ODBC.Mantenha as informações de conexão fora do seu código. Armazene no sistema de configuração do seu aplicativo e use o Azure Key Vault para segredos.
Com SQLSRV, as opções de conexão definidas no array passaram para
sqlsrv_connect(). Verifique se há umfalseretorno e inspecionesqlsrv_errors()antes de decidir se deve tentar novamente. Defina os tempos limite dos statements separadamente comQueryTimeout. A resiliência da conexão ociosa demonstra reconexão ODBC, não um ciclo de retentativa em nível de aplicação.Os auxiliares de repetição leem
$e->errorInfo[1]protegido porisset().PDOException::$errorInfoé declarado como?arraye tem como padrãonull, portanto a verificação defensiva recorre a um código do driver0e deixa que o prefixo SQLSTATE08determine se deve tentar novamente.
Para obter mais informações sobre cada parte dessa configuração, consulte:
- Opções de conexão
- Conectar-se usando a autenticação do Microsoft Entra
- Resiliência da conexão ociosa
- Conectar-se ao Banco de Dados SQL do Microsoft Azure
- Suporte para Alta Disponibilidade, recuperação de desastres
Para o catálogo de erros transitórios do SQL do Azure, consulte Solucionar problemas de erros de conexão transitórios.
Características principais
- Duas APIs PHP: SQLSRV fornece funções procedurais. PDO_SQLSRV implementa PDO. Instale uma das extensões ou as duas.
- Suporte a plataforma ampla: Roda em Windows, Linux e macOS com versões PHP suportadas.
-
Conexões criptografadas: Conexões criptografadas por TLS via
Encrypt=true, com validação de certificado do servidor controlada porTrustServerCertificate. -
Autenticação Microsoft Entra ID: Identidade gerenciada, principal de serviço e tokens de acesso adquiridos externamente através do driver Microsoft ODBC para SQL Server subjacente. Identidade gerenciada dispensa senha;
ActiveDirectoryServicePrincipalusa um segredo do cliente. - Always Encrypted: Criptografe colunas sensíveis no cliente, com enclaves seguros para operações suportadas em dados criptografados.
-
Resiliência de conexão: repetições de conexão ociosa integradas com
ConnectRetryCounteConnectRetryInterval. - Fluxos PHP: Envie grandes valores binários e de caracteres a partir dos parâmetros do fluxo com qualquer uma das APIs. Use SQLSRV para recuperação por streaming.
-
Amplo suporte a tipos de dados do SQL Server: datetimeoffset, parâmetros com valor de tabela, nvarchar, e Unicode com
PDO::SQLSRV_ENCODING_UTF8.
Introdução
| Artigo | Description |
|---|---|
| Requisitos do sistema | Suportava versões para PHP, sistema operacional e SQL Server. |
| Matriz de suporte | Matriz detalhada de compatibilidade para lançamentos de drivers PHP. |
| Baixe os drivers da Microsoft para PHP para SQL Server | Links de download e artefatos de lançamento. |
| Tutorial de instalação para Linux e macOS | Instale o driver e seus pré-requisitos ODBC no Linux e macOS. |
| Carregando os drivers | Ative as extensões em php.ini. |
| Início Rápido: Conecte-se e consulte com os drivers Microsoft para PHP | Verifique as extensões, configure uma conexão e execute a mesma consulta parametrizada com SQLSRV ou PDO_SQLSRV. |
| Visão geral do driver PHP SQL | O que está no pacote e quando escolher SQLSRV ou PDO_SQLSRV. |
Configuração e conexão
| Artigo | Description |
|---|---|
| Conectando ao servidor | Abra uma conexão para uma instância do SQL Server a partir do PHP. |
| Opções de conexão | Referência completa para palavras-chave de conexão, padrões e como configurá-las. |
| Conectar-se ao Banco de Dados SQL do Microsoft Azure | Conecte uma aplicação PHP ao Banco de Dados SQL do Azure. |
| Conecte-se em uma porta especificada | Aponte uma porta TCP não padrão. |
| Agrupamento de conexões | Reutilize conexões ODBC entre requisições PHP. |
| Desabilite Múltiplos Conjuntos de Resultados Ativos (MARS) | Desative o MARS para compatibilidade. |
| Suporte ao LocalDB | Conecte-se a uma instância do LocalDB do SQL Server. |
| Suporte para Alta Disponibilidade, recuperação de desastres | Ouvintes de grupo de disponibilidade e failover de várias sub-redes. |
| Resiliência da conexão ociosa | Reconexão automática para conexões ociosas quebradas. |
Authenticate
| Artigo | Description |
|---|---|
| Conectar-se usando a autenticação do Microsoft Entra | Fluxos de identidade gerenciada, entidade de serviço, token de acesso e senha. |
| Conecte-se usando autenticação SQL Server | Use um login SQL com nome de usuário e senha. |
| Conecte-se usando autenticação do Windows | Use autenticação integrada no Windows ou Kerberos no Linux e macOS. |
Secure
| Artigo | Description |
|---|---|
| Considerações de segurança | Modelo de ameaça e orientação aprofundada de defesa para aplicações PHP. |
| Always Encrypted com os drivers PHP | Configure a criptografia do lado do cliente para colunas confidenciais. |
| Always Encrypted com enclaves seguros | Habilite operações avançadas em colunas criptografadas com enclaves seguros. |
Recuperar e atualizar dados
| Artigo | Description |
|---|---|
| Guia de programação | Encontre tarefas de programação para ambos os controladores. |
| Comparando funções de execução | Escolha a função de execução certa para sua carga de trabalho. |
| Execução direta e preparada de instruções (PDO_SQLSRV) | Quando usar execução direta versus instruções preparadas. |
| Recuperação de dados | Busque linhas, colunas e valores de streaming. |
| Atualização dos dados | Inserir, atualizar e excluir linhas. |
| Realizar consultas parametrizadas | Vincule parâmetros para proteger contra injeção SQL. |
| Enviar dados como um fluxo | Transmita valores binários e de caracteres grandes para o SQL Server. |
| Realizar transações | Faça commit ou reverta um grupo de instruções juntos. |
| Uso de parâmetros com valores de tabela | Passe um TABLE parâmetro para um procedimento armazenado. |
| Especifique um tipo de cursor e selecione linhas | Escolher cursores somente para frente, estáticos, dinâmicos ou de conjunto de chaves. |
Tipos de dados
| Artigo | Description |
|---|---|
| Conversão de tipos de dados | Como o driver mapeia tipos PHP para tipos SQL Server. |
| Tipos de dados padrão do SQL Server | Tipo padrão de SQL Server para cada valor PHP. |
| Tipos de dados padrão PHP | Tipo padrão de PHP para cada tipo de coluna do SQL Server. |
| Especificar tipos de dados do SQL Server (SQLSRV) | Substituir o tipo do SQL Server ao vincular parâmetros. |
| Especificar tipos de dados PHP | Substituir o tipo do PHP ao buscar dados. |
| Enviar e recuperar dados UTF-8 | Defina a CharacterSet opção do SQLSRV ou o atributo do PDO::SQLSRV_ATTR_ENCODING PDO_SQLSRV. |
| Enviar e recuperar dados ASCII no Linux e macOS | Lidar com viagens de ida e volta ASCII em hosts não Windows. |
| Formatar decimais e dinheiro (SQLSRV) | Formate as colunas decimais e de dinheiro com o driver SQLSRV. |
| Formatar decimais e valores monetários (PDO_SQLSRV) | Formate colunas decimais e monetárias com o driver PDO_SQLSRV. |
| Configurações de localização fora do sistema | Separadores decimais localizados e outras considerações locais. |
Erros e diagnóstico
| Artigo | Description |
|---|---|
| Tratamento de erros e avisos | Tratamento de erros e avisos com ambos os drivers. |
| Configurar o tratamento de erros e avisos (SQLSRV) | Ajuste como o driver SQLSRV reporta erros e avisos. |
| Gerenciar erros e avisos (SQLSRV) | Inspecione os erros retornados pelas funções SQLSRV. |
| Atividade de registro | Habilitar o registro de logs do driver para captura de diagnóstico. |
Implantar e operar
| Artigo | Description |
|---|---|
| Otimização do desempenho | Gerenciamento de conexões, processamento em lote, instruções preparadas, cursores, memória e monitoramento no lado do servidor. |
| Solução de problemas | Diagnosticar problemas comuns de instalação, conexão, consulta, tipo de dado, transação e container. |
Conteúdo de referência
| Artigo | Description |
|---|---|
| Referência à API do driver SQLSRV | Todas sqlsrv_* as funções, parâmetros e valores de retorno. |
| Referência do driver PDO_SQLSRV | Métodos PDO e PDOStatement suportados pelo driver PDO_SQLSRV. |
| Constantes | Constantes expostas pelos drivers, incluindo constantes de tipo e codificação. |
Tarefas relacionadas
| Artigo | Description |
|---|---|
| Notas de lançamento | Histórico de versões por versão com novos recursos, correções de bugs, mudanças no suporte à plataforma e links para download. |
| Sobre exemplos de código na documentação | Convenções usadas pelos exemplos de código nesta seção. |
| Exemplos de código para o driver SQL PHP | Exemplos de aplicações de ponta a ponta para SQLSRV e PDO_SQLSRV. |
| Recursos de suporte | Comunidade e canais de apoio. |
Solicitar um recurso
Para solicitar uma funcionalidade, abra uma questão no Microsoft Drivers for PHP para SQL Server GitHub repositório.