Carica i driver Microsoft per PHP per SQL Server

I driver SQLSRV e PDO_SQLSRV sono estensioni PHP. PHP li carica quando il processo PHP inizia leggendo php.ini ed eventuali file aggiuntivi .ini.

Il caricamento è separato dall'installazione. La copia o la compilazione dell'estensione colloca un file sul disco. PHP non può usare SQLSRV o PDO_SQLSRV finché la configurazione attiva non contiene la voce corretta e il processo PHP non si riavvia.

Proteggi le pagine diagnostiche web

Prima di creare una pagina temporanea phpinfo(), configura il server web per consentire solo richieste da localhost o da amministratori autenticati. Mantieni quella restrizione finché non elimini la pagina. phpinfo() può esporre variabili dell'ambiente, credenziali e configurazioni del server. Rimuovi la pagina immediatamente successiva alla verifica.

Comprendere l'ambito di configurazione PHP

Ogni interfaccia di programmazione applicativa server PHP (SAPI) può utilizzare un eseguibile e una configurazione diversi:

Runtime Origine configurazione tipica Come riconoscerlo
Interfaccia della riga di comando (CLI) La php.ini directory e la scansione riportate da php --ini Esegui php --ini con l'eseguibile esatto
IIS FastCGI L'eseguibile PHP configurato nell'applicazione IIS FastCGI Usa una pagina phpinfo() temporanea
Modulo Apache Configurazione del modulo PHP di Apache Usa una phpinfo() pagina temporanea
PHP-FPM L'eseguibile FPM, il pool, php.ini, e la directory di scansione Esegui il binario FPM versionato con -i oppure usa una phpinfo() pagina temporanea
Worker a lunga esecuzione L'eseguibile e l'ambiente che ha dato origine al worker Ispeziona il servizio worker e riavvia dopo le modifiche

Cambiare la configurazione della CLI non cambia IIS, Apache o PHP-FPM quando usano un'altra installazione PHP o una directory di scansione.

Trova la configurazione PHP

Esegui questi comandi con l'eseguibile PHP usato dalla tua applicazione:

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

Su Linux o macOS, sostituisci findstr con grep:

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

Il file comando identifica l'architettura dell'eseguibile selezionato. Per un eseguibile universale macOS, segui la selezione esplicita dell'architettura.

Il File di Configurazione Caricato e i valori Scansiona ulteriori file .ini in identificano la configurazione utilizzata dal processo da riga di comando. Un server web o un processo PHP FastCGI Process Manager (PHP-FPM) potrebbe utilizzare un diverso eseguibile PHP o un diverso file di configurazione PHP. Usa una pagina temporanea phpinfo() per identificare i valori di quel processo.

Prima di modificare un file, registra:

  • Il percorso e la versione dell'eseguibile PHP.
  • Caricato php.ini.
  • Directory di scansione aggiuntiva .ini.
  • La cartella delle estensioni.
  • La modalità di thread safety e l'architettura.
  • Ogni processo che devi riavviare.

Fai il backup di ogni file di configurazione che modifichi.

Carica i driver su Windows

Per un'installazione con il PHP Installer for Extensions (PIE), prima scarica e verifica PIE. Esegui i seguenti comandi dalla directory che contiene pie.phar, con l'eseguibile PHP che dovrebbe caricare i driver:

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

PIE installa php_sqlsrv.dll e php_pdo_sqlsrv.dll. Se PIE non può abilitare automaticamente le estensioni, rimuovere qualsiasi voce SQLSRV e PDO_SQLSRV esistente dal file attivo php.ini, poi aggiunga:

extension=php_sqlsrv.dll
extension=php_pdo_sqlsrv.dll

Usa solo una voce per ogni driver. Riavvia il processo PHP dopo aver cambiato la configurazione.

Per un'installazione ZIP, copia nella directory extension_dir le librerie a collegamento dinamico (DLL) che corrispondono alla versione minore di PHP, all'architettura e alla modalità thread-safety. Un runtime thread-safe PHP 8.5 x64 utilizza questi nomi file:

php_sqlsrv_85_ts_x64.dll
php_pdo_sqlsrv_85_ts_x64.dll

Aggiungi entrambi i nomi file a php.ini usato dal processo PHP:

extension=php_sqlsrv_85_ts_x64.dll
extension=php_pdo_sqlsrv_85_ts_x64.dll

Sostituisci 85, ts e x64 con i valori del tuo runtime PHP. Non mischiare file thread-safe e non thread-safe, file a 32 e 64 bit, o file costruiti per un'altra versione minore di PHP.

Carica i driver su Linux e macOS

Installa i driver usando PIE. Per maggiori informazioni, consulta il tutorial sull'installazione di Linux e macOS. PIE installa i file di estensione e cerca di abilitarli utilizzando gli strumenti di configurazione PHP della piattaforma o aggiungendo una voce extension= in un file .ini aggiuntivo o allo standard php.ini. Se PIE segnala che non è riuscito ad abilitare un'estensione, aggiungi tu stesso la voce e verifica la configurazione attiva.

Per un'installazione manuale, seleziona i file precompilati .so che corrispondono alla versione PHP, all'architettura, alla modalità thread-safety e alle librerie native del sistema operativo. Controlla i requisiti precompilati di Linux e macOS; usa PIE se non corrispondono al tuo ambiente.

Ad esempio, i file PHP 8.4 non thread-safe sono nominati SQLSRV_8.4_NTS.so e PDO_SQLSRV_8.4_NTS.so. Inserili nella directory restituita da php -i | grep extension_dir. Rinominali in sqlsrv.so e pdo_sqlsrv.so per utilizzare le seguenti voci, oppure usa esattamente i nomi dei file dei pacchetti nelle voci. Aggiungi le voci alla tua configurazione PHP attiva nell'ordine di caricamento descritto in questa sezione:

extension=sqlsrv.so
extension=pdo_sqlsrv.so

PHP Data Objects (PDO) devono essere caricati prima di PDO_SQLSRV. PHP legge php.ini prima di scansionare ulteriori .ini file in ordine alfabetico. Se la tua distribuzione carica pdo.so da un file scansionato, inserisci la voce PDO_SQLSRV in un file scansionato successivamente, ad esempio 30-pdo_sqlsrv.ini quando PDO utilizza 10-pdo.ini. In quel caso non inserire la PDO_SQLSRV voce php.ini .

Scegli le voci di estensione

Usa voci che corrispondano a come sono stati installati i driver:

Piattaforma e metodo Voce SQLSRV voce PDO_SQLSRV
Windows con PIE extension=php_sqlsrv.dll extension=php_pdo_sqlsrv.dll
ZIP rilasciato in Windows Nome esatto della DLL versionato, come extension=php_sqlsrv_85_ts_x64.dll Nome esatto della DLL versionato, come extension=php_pdo_sqlsrv_85_ts_x64.dll
Linux o macOS con PIE extension=sqlsrv.so extension=pdo_sqlsrv.so
Archivio Linux o macOS rilasciato, file rinominati extension=sqlsrv.so extension=pdo_sqlsrv.so
Archivio della release per Linux o macOS, file originali Nome del file di archivio esatto, come ad esempio extension=SQLSRV_8.4_NTS.so Nome file d'archivio esatto, come ad esempio extension=PDO_SQLSRV_8.4_NTS.so

Non configurare sia un nome breve che uno versionato per la stessa estensione. PHP può segnalare che un modulo è già caricato, oppure può continuare a caricare un file più vecchio dopo un aggiornamento.

Riavvia PHP per caricare i driver

Riavvia il processo dopo aver modificato un file di estensione o un file di configurazione. Riavvia il server web, PHP-FPM, i worker della coda e altri processi PHP di lunga durata che caricano il driver.

Le estensioni SQLSRV e PDO_SQLSRV possono essere caricate indipendentemente, ma installa e verifica entrambe quando la tua applicazione utilizza entrambi i driver. PDO è integrato in molti pacchetti PHP. Se il PDO non è integrato, attiva l'estensione PDO prima di PDO_SQLSRV.

Verifica i driver caricati

Per l'esecuzione in linea di comando, esegui:

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

Su Linux o macOS, usa:

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

Per un server web, limita l'accesso alla pagina diagnostica prima di creare una pagina temporanea contenente <?php phpinfo(); ?>. Conferma il file di configurazione caricato, extension_dir e sezioni separate sqlsrvpdo_sqlsrv . Rimuovi la pagina dopo la verifica.

Esegui anche un controllo a livello PHP così la verifica copre entrambe le API e non solo i nomi dei moduli. Salva questo programma come 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);

Esegui il programma con ogni eseguibile PHP che la tua applicazione utilizza:

php verify-php-drivers.php

Output previsto:

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

Per un runtime web, posiziona temporaneamente il file nella document root e richiedilo in un browser. Rimuovilo dopo la verifica. Questo programma non apre una connessione al database né stampa i valori di configurazione.

Cancella verify-php-drivers.php dopo aver completato la CLI e i controlli di web-runtime.

Risolvere i problemi di caricamento del driver

Sintomo Fai controllare Azione correttiva
Unable to load dynamic library Nome file sbagliato, extension_dirversione minore di PHP, architettura o modalità thread-safe sbagliata Confronta php -i con il file driver selezionato e usa temporaneamente un percorso assoluto per isolare gli errori di percorso
The specified module could not be found in Windows La DLL del driver o una delle sue dipendenze non sono disponibili Verifica che la DLL sia in extension_dir, installa il runtime Visual C++ corrispondente e ispeziona eventuali dipendenze DLL mancanti
undefined symbol o errore di libreria condivisa su Linux o macOS Incompatibilità tra l'estensione e la build PHP, o dipendenza ODBC mancante Ricostruisci con la php-config desiderata, poi ispeziona la libreria mancante segnalata
Module "sqlsrv" is already loaded Voci duplicate o due file scansionati Cerca l'elemento caricato php.ini e la directory di scansione, poi mantieni una voce
could not find driver da PDO PDO_SQLSRV non è caricato, oppure PDO viene caricato dopo PDO_SQLSRV Controlla php --ri pdo_sqlsrv e sposta la voce PDO_SQLSRV dopo il PDO
La CLI funziona ma le richieste web falliscono Configurazione SAPI diversa o un processo che non è stato riavviato Confronta i valori della CLI e della configurazione phpinfo(), modifica la configurazione web e riavvia il processo web
Il vecchio ExtensionVer rimane dopo un aggiornamento La configurazione nomina ancora un file versionato più vecchio Sostituisci la vecchia voce con il file installato dal metodo selezionato, rimuovi i duplicati e riavvia tutti i processi PHP

PHP si occupa della scoperta delle estensioni e dell'ordine di caricamento. PIE o una copia manuale fornisce il file di estensione. Il loader del sistema operativo risolve le dipendenze native. Il driver Microsoft ODBC gestisce il protocollo database dopo il caricamento dell'estensione.