Carregue os drivers Microsoft para PHP para SQL Server

Os drivers SQLSRV e PDO_SQLSRV são extensões PHP. O PHP carrega-os quando o processo PHP começa, lendo php.ini e quaisquer ficheiros adicionais .ini .

O carregamento é separado da instalação. Copiar ou compilar a extensão coloca um ficheiro no disco. O PHP não pode usar SQLSRV ou PDO_SQLSRV até que a configuração ativa contenha a entrada correta e o processo PHP reinicie.

Proteger páginas de diagnóstico web

Antes de criar uma página temporária phpinfo() , configure o servidor web para permitir apenas pedidos do localhost ou administradores autenticados. Mantém essa restrição até eliminares a página. phpinfo() pode expor variáveis de ambiente, credenciais e configuração do servidor. Remova a página imediatamente após a verificação.

Compreender o âmbito da configuração do PHP

Cada interface de programação de aplicações do servidor PHP (SAPI) pode usar um executável e uma configuração diferentes:

Runtime Fonte típica de configuração Como identificá-lo
Interface de linha de comando (CLI) O php.ini e o diretório de varrimento reportados por php --ini Executar php --ini com o executável exato
IIS FastCGI O executável PHP configurado na aplicação IIS FastCGI Usar uma página temporária phpinfo()
Módulo Apache Configuração do módulo PHP do Apache Usar uma página temporária phpinfo()
PHP-FPM O executável FPM, pool, php.ini, e diretório de varrimento Execute o binário FPM versionado com -i ou use uma página phpinfo() temporária
Processo de longa duração O executável e o ambiente que iniciaram o worker Inspecione o serviço worker e reinicie-o após alterações

Mudar a configuração da CLI não altera o IIS, Apache ou PHP-FPM quando usam outra instalação PHP ou diretório de scan.

Localizar a configuração do PHP

Execute estes comandos com o executável PHP usado pela sua aplicação:

php --ini
php -i | findstr /I "PHP Version Thread Safety Architecture extension_dir"

No Linux ou macOS, substitua findstr por grep:

php -i | grep -E "PHP Version|Thread Safety|extension_dir"
file "$(php -r 'echo PHP_BINARY;')"

O file comando identifica a arquitetura do executável selecionado. Para um executável universal do macOS, siga a seleção explícita da arquitetura.

O Ficheiro de Configuração Carregado e os valores de Procurar ficheiros .ini adicionais em identificam a configuração usada pelo processo de linha de comandos. Um servidor web ou um processo PHP FastCGI Process Manager (PHP-FPM) pode usar um executável ou ficheiro de configuração PHP diferente. Utilize uma página temporária phpinfo() para identificar os valores desse processo.

Antes de editar um ficheiro, regista:

  • O caminho e a versão do executável PHP.
  • O carregamento php.ini.
  • O diretório de análise adicional .ini.
  • O diretório da extensão.
  • O modo de segurança de execução entre threads e a arquitetura.
  • Cada processo que tem de reiniciar.

Faz backup de cada ficheiro de configuração que alteras.

Instalar os controladores no Windows

Para uma instalação com o PHP Installer for Extensions (PIE), primeiro descarregue e verifique o PIE. Execute os seguintes comandos a partir do diretório que contém pie.phar, com o executável PHP que deve carregar os drivers:

php .\pie.phar install microsoft/sqlsrv
php .\pie.phar install microsoft/pdo_sqlsrv

PIE instala php_sqlsrv.dll e php_pdo_sqlsrv.dll. Se o PIE não conseguir ativar as extensões automaticamente, remova quaisquer entradas SQLSRV e PDO_SQLSRV existentes do ficheiro de configuração ativo php.ini, depois adicione:

extension=php_sqlsrv.dll
extension=php_pdo_sqlsrv.dll

Use apenas um registo para cada condutor. Reinicie o processo PHP após alterar a sua configuração.

Para uma instalação ZIP, copie as bibliotecas de ligação dinâmica (DLLs) que correspondem à versão secundária do PHP, arquitetura e modo de segurança de threads para o diretório extension_dir. Um runtime PHP 8.5 x64 thread-safe utiliza estes nomes de ficheiros:

php_sqlsrv_85_ts_x64.dll
php_pdo_sqlsrv_85_ts_x64.dll

Adicione ambos os nomes de ficheiros ao php.ini utilizado pelo processo PHP:

extension=php_sqlsrv_85_ts_x64.dll
extension=php_pdo_sqlsrv_85_ts_x64.dll

Substitua 85, ts e x64 pelos valores do runtime do PHP. Não misture ficheiros thread-safe e não-thread-safe, ficheiros de 32 bits e 64 bits, ou ficheiros compilados para outra versão secundária do PHP.

Carregue os controladores no Linux e macOS

Instala os drivers usando PIE. Para mais informações, consulte o tutorial de instalação do Linux e macOS. O PIE instala os ficheiros de extensão e tenta habilitá-los usando as ferramentas de configuração PHP da plataforma ou adicionando uma entrada extension= a um ficheiro adicional .ini ou ao ficheiro padrão php.ini. Se o PIE reportar que não conseguiu ativar uma extensão, adiciona tu mesmo a entrada e verifica a configuração ativa.

Para uma instalação manual, selecione os ficheiros pré-construídos .so que correspondam à sua versão PHP, arquitetura, modo de segurança de threads e bibliotecas nativas do sistema operativo. Verifica os requisitos pré-construídos para Linux e macOS; usa PIE se não corresponderem ao teu ambiente.

Por exemplo, ficheiros PHP 8.4 sem segurança para threads são nomeados SQLSRV_8.4_NTS.so e PDO_SQLSRV_8.4_NTS.so. Coloque-os no diretório devolvido por php -i | grep extension_dir. Renomeie-os para sqlsrv.so e pdo_sqlsrv.so para usar as seguintes entradas, ou use os nomes exatos dos ficheiros de pacote nas entradas. Adicione as entradas à sua configuração PHP ativa na ordem de carregamento descrita nesta secção:

extension=sqlsrv.so
extension=pdo_sqlsrv.so

PHP Data Objects (PDO) devem ser carregados antes de PDO_SQLSRV. O PHP lê php.ini antes de analisar ficheiros adicionais .ini por ordem alfabética. Se a sua distribuição carregar pdo.so a partir de um ficheiro analisado, coloque a entrada PDO_SQLSRV num ficheiro analisado posterior, como 30-pdo_sqlsrv.ini quando o PDO usa 10-pdo.ini. Nesse caso, não coloques a entrada PDO_SQLSRV em php.ini.

Escolha as entradas da extensão

Use itens que correspondam à forma como os drivers foram instalados:

Plataforma e método Entrada SQLSRV entrada PDO_SQLSRV
Windows com PIE extension=php_sqlsrv.dll extension=php_pdo_sqlsrv.dll
Windows ZIP sem proteção Nome exato da DLL versionado, tal como extension=php_sqlsrv_85_ts_x64.dll Nome exato da DLL com versão, tais como extension=php_pdo_sqlsrv_85_ts_x64.dll
Linux ou macOS com PIE extension=sqlsrv.so extension=pdo_sqlsrv.so
Arquivo lançado para Linux ou macOS, ficheiros renomeados extension=sqlsrv.so extension=pdo_sqlsrv.so
Arquivo disponibilizado para Linux ou macOS, ficheiros originais Nome exato do ficheiro de arquivo, como extension=SQLSRV_8.4_NTS.so Nome exato do ficheiro comprimido, como extension=PDO_SQLSRV_8.4_NTS.so

Não configures tanto um nome curto como um nome versionado para a mesma extensão. O PHP pode reportar que um módulo já está carregado, ou pode continuar a carregar um ficheiro mais antigo após uma atualização.

Reinicie o PHP para carregar os drivers

Reinicie o processo após alterar um ficheiro de extensão ou de configuração. Reinicie o servidor web, o PHP-FPM, os trabalhadores de fila e outros processos PHP de longa duração que carreguem o driver.

As extensões SQLSRV e PDO_SQLSRV podem ser carregadas de forma independente, mas instale e verifique ambas quando a sua aplicação usar ambos os drivers. O PDO está integrado em muitos pacotes PHP. Se o PDO não estiver incorporado, ativa a extensão PDO antes de PDO_SQLSRV.

Verifique os drivers carregados

Para o tempo de execução da linha de comandos, execute:

php --ri sqlsrv
php --ri pdo_sqlsrv
php -m | findstr /I "sqlsrv pdo_sqlsrv"

No Linux ou macOS, use:

php --ri sqlsrv
php --ri pdo_sqlsrv
php -m | grep -E "sqlsrv|pdo_sqlsrv"

Para um servidor web, restringa o acesso a páginas de diagnóstico antes de criar uma página temporária contendo <?php phpinfo(); ?>. Confirme o ficheiro de configuração carregado, extension_dir e as secções sqlsrv e pdo_sqlsrv. Remova a folha após a verificação.

Também faz uma verificação ao nível PHP para que a verificação cubra ambas as APIs e não apenas os nomes dos módulos. Guarde este programa como verify-php-drivers.php:

<?php
$checks = [
    'SQLSRV extension' => extension_loaded('sqlsrv'),
    'SQLSRV API' => function_exists('sqlsrv_connect'),
    'PDO_SQLSRV extension' => extension_loaded('pdo_sqlsrv'),
    'PDO_SQLSRV API' => class_exists('PDO')
        && in_array('sqlsrv', PDO::getAvailableDrivers(), true),
];

$failed = false;
foreach ($checks as $name => $passed) {
    echo $name . ': ' . ($passed ? 'loaded' : 'missing') . PHP_EOL;
    $failed = $failed || !$passed;
}

exit($failed ? 1 : 0);

Execute o programa com cada executável PHP que a sua aplicação utilize:

php verify-php-drivers.php

Produção esperada:

SQLSRV extension: loaded
SQLSRV API: loaded
PDO_SQLSRV extension: loaded
PDO_SQLSRV API: loaded

Para um ambiente de execução web, coloque temporariamente o ficheiro na document root e abra-o num navegador. Remova-o após verificação. Este programa não abre uma ligação à base de dados nem imprime valores de configuração.

Elimina verify-php-drivers.php depois de terminares a CLI e as verificações de web-runtime.

Resolução de problemas de carregamento do controlador

Symptom Fazer verificar Ação corretiva
Unable to load dynamic library Nome de ficheiro errado, extension_dirversão menor do PHP, arquitetura ou modo de segurança de thread errado Compare php -i com o ficheiro de driver selecionado e use temporariamente um caminho absoluto para isolar erros de caminho
The specified module could not be found no Windows A DLL do driver ou uma das suas dependências não está disponível Confirme que a DLL está em extension_dir, instale o runtime Visual C++ correspondente e inspecione qualquer dependência DLL em falta remanescente
undefined symbol ou erro de biblioteca partilhada no Linux ou macOS Incompatibilidade entre extensões e compilações do PHP, ou falta de dependência de ODBC Reconstrua com o php-config correto, depois inspecione a biblioteca reportada em falta
Module "sqlsrv" is already loaded Entradas duplicadas ou dois ficheiros digitalizados Procura no php.ini carregado e no diretório de análise, depois mantém uma entrada
could not find driver do PDO PDO_SQLSRV não é carregado, ou o PDO carrega depois dele Verifique php --ri pdo_sqlsrv e mova a entrada PDO_SQLSRV após o PDO
A CLI funciona, mas os pedidos web falham Configuração SAPI diferente ou um processo que não foi reiniciado Compare os valores da CLI e da configuração phpinfo(), edite a configuração web e reinicie o processo web
O antigo ExtensionVer permanece após uma atualização A configuração ainda nomeia um ficheiro de versão mais antiga Substitua a entrada antiga pelo ficheiro instalado pelo método selecionado, remova duplicados e reinicie todos os processos PHP

O PHP é responsável pela descoberta de extensões e pela ordem de carregamento. O PIE ou uma cópia feita manualmente fornece o ficheiro de extensão. O carregador do sistema operativo resolve dependências nativas. O Microsoft ODBC Driver assume o protocolo da base de dados após o carregamento da extensão.