Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.