Chargez les pilotes Microsoft pour PHP pour SQL Server

Les pilotes SQLSRV et PDO_SQLSRV sont des extensions PHP. PHP les charge lorsque le processus PHP démarre, en lisant php.ini et tout fichier .ini supplémentaire.

Le chargement est distinct de l’installation. Copier ou construire l’extension place un fichier sur le disque. PHP ne peut pas utiliser SQLSRV ou PDO_SQLSRV tant que la configuration active ne contient pas la bonne entrée et que le processus PHP n’a pas redémarré.

Protéger les pages de diagnostic web

Avant de créer une page temporaire phpinfo(), configurez le serveur web pour n’autoriser que les requêtes provenant de localhost ou les administrateurs authentifiés. Gardez cette restriction jusqu’à ce que vous supprimiez la page. phpinfo() peut exposer les variables d’environnement, les identifiants et la configuration des serveurs. Supprimez la page suivant immédiatement la vérification.

Comprendre la portée de la configuration PHP

Chaque interface de programmation d’application serveur PHP (SAPI) peut utiliser un exécutable et une configuration différents :

Runtime Source de configuration typique Comment l’identifier
Interface de ligne de commande (CLI) Le php.ini répertoire d’analyse signalé par php --ini Exécutez php --ini avec l’exécutable exact
IIS FastCGI L’exécutable PHP configuré dans l’application IIS FastCGI Utiliser une page temporaire phpinfo()
Module Apache Configuration du module PHP d’Apache Utiliser une page temporaire phpinfo()
PHP-FPM L’exécutable FPM, le pool, php.ini, et le répertoire de balayage Exécutez le binaire FPM versionné -i ou utilisez une page phpinfo() temporaire
worker de longue durée L’exécutable et l’environnement qui ont lancé le worker Inspectez le service worker et redémarrez-le après les modifications

Changer la configuration de la CLI ne modifie pas IIS, Apache ou PHP-FPM lorsqu’ils utilisent une autre installation de PHP ou un répertoire de scan.

Trouvez la configuration PHP

Exécutez ces commandes avec l’exécutable PHP utilisé par votre application :

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

Sous Linux ou macOS, remplacez findstr par grep:

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

La file commande identifie l’architecture de l’exécutable sélectionné. Pour un exécutable universel macOS, suivez la sélection explicite de l’architecture.

Les valeurs Fichier de configuration chargé et Recherche de fichiers .ini supplémentaires dans identifient la configuration utilisée par le processus exécuté en ligne de commande. Un serveur web ou un processus PHP FastCGI Process Manager (PHP-FPM) peut utiliser un exécutable PHP ou un fichier de configuration différent. Utilisez une page temporaire phpinfo() pour identifier les valeurs associées à ce processus.

Avant de modifier un fichier, notez :

  • Le chemin et la version de l’exécutable PHP.
  • Le chargé php.ini.
  • Le répertoire d’analyse supplémentaire.ini
  • Le répertoire d’extensions.
  • Le mode de sécurité des threads et l’architecture.
  • Chaque processus que vous devez redémarrer.

Sauvegardez chaque fichier de configuration que vous modifiez.

Installez les pilotes sous Windows

Pour une installation avec le PHP Installer for Extensions (PIE),téléchargez et vérifiez d’abord PIE. Exécutez les commandes suivantes depuis le répertoire contenant pie.phar, avec l’exécutable PHP qui devrait charger les pilotes :

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

PIE installe php_sqlsrv.dll et php_pdo_sqlsrv.dll. Si PIE ne peut pas activer automatiquement les extensions, supprimez toutes les entrées SQLSRV et PDO_SQLSRV existantes du fichier de configuration actif php.ini, puis ajoutez :

extension=php_sqlsrv.dll
extension=php_pdo_sqlsrv.dll

Utilisez une seule entrée pour chaque pilote. Redémarrez le processus PHP après avoir modifié sa configuration.

Pour une installation ZIP, copiez dans le extension_dir répertoire les bibliothèques à liens dynamiques (DLL) qui correspondent à la version mineure de PHP, à l’architecture et au mode de sécurité des threads. Un environnement d’exécution PHP 8.5 x64 thread-safe utilise les noms de fichier suivants :

php_sqlsrv_85_ts_x64.dll
php_pdo_sqlsrv_85_ts_x64.dll

Ajoutez les deux noms de fichiers au php.ini utilisé par le processus PHP :

extension=php_sqlsrv_85_ts_x64.dll
extension=php_pdo_sqlsrv_85_ts_x64.dll

Remplacez 85, ts, et x64 par les valeurs de votre runtime PHP. Ne mélangez pas les fichiers thread-safe et non-thread-safe, les fichiers 32 bits et 64 bits, ou les fichiers conçus pour une autre version mineure PHP.

Installez les pilotes sous Linux et macOS

Installez les pilotes en utilisant PIE. Pour plus d’informations, consultez le tutoriel d’installation Linux et macOS. PIE installe les fichiers d’extension et tente de les activer en utilisant les outils de configuration PHP de la plateforme ou en ajoutant une entrée extension= à un fichier supplémentaire .ini ou au fichier php.ini standard. Si PIE indique qu’il n’a pas pu activer une extension, ajoutez vous-même l’entrée et vérifiez la configuration active.

Pour une installation manuelle, sélectionnez les fichiers préconstruits .so qui correspondent à votre version PHP, à votre architecture, au mode de sécurité des threads et aux bibliothèques natives du système d’exploitation. Vérifiez les exigences Linux et macOS préconfigurées ; utilisez PIE si elles ne correspondent pas à votre environnement.

Par exemple, les fichiers PHP 8.4 non thread-safe portent le nom SQLSRV_8.4_NTS.so et PDO_SQLSRV_8.4_NTS.so. Placez-les dans le répertoire retourné par php -i | grep extension_dir. Renomme-les en sqlsrv.so et pdo_sqlsrv.so pour utiliser les entrées suivantes, ou utilise les noms exacts des fichiers de paquets dans les entrées à la place. Ajoutez les entrées à votre configuration PHP active dans l’ordre de chargement décrit dans cette section :

extension=sqlsrv.so
extension=pdo_sqlsrv.so

Les objets de données PHP (PDO) doivent se charger avant PDO_SQLSRV. PHP lit php.ini avant de scanner des fichiers supplémentaires .ini par ordre alphabétique. Si votre distribution charge pdo.so à partir d’un fichier analysé, placez l’entrée PDO_SQLSRV dans un fichier analysé ultérieur, comme 30-pdo_sqlsrv.ini lorsque PDO utilise 10-pdo.ini. Dans ce cas, ne placez pas l’entrée PDO_SQLSRV dans php.ini.

Choisissez les entrées de l’extension

Utilisez des entrées qui correspondent à la façon dont les pilotes ont été installés :

Plateforme et méthode Entrée SQLSRV entrée PDO_SQLSRV
Windows avec PIE extension=php_sqlsrv.dll extension=php_pdo_sqlsrv.dll
ZIP compressé par Windows Nom exact versionné de la DLL, tel que extension=php_sqlsrv_85_ts_x64.dll Nom exact de la DLL versionné, tel que extension=php_pdo_sqlsrv_85_ts_x64.dll
Linux ou macOS avec PIE extension=sqlsrv.so extension=pdo_sqlsrv.so
Archive publiée pour Linux ou macOS, fichiers renommés extension=sqlsrv.so extension=pdo_sqlsrv.so
Linux ou macOS : archive publiée, fichiers originaux Nom exact du fichier d’archive, tel que extension=SQLSRV_8.4_NTS.so Nom exact de fichier d’archive, comme extension=PDO_SQLSRV_8.4_NTS.so

Ne configurez pas à la fois un nom court et un nom versionné pour la même extension. PHP peut signaler qu’un module est déjà chargé, ou continuer à charger un fichier plus ancien après une mise à jour.

Redémarrez PHP pour charger les drivers

Redémarrez le processus après avoir modifié un fichier d’extension ou un fichier de configuration. Redémarrez le serveur web, PHP-FPM, les workers de file d’attente et d’autres processus PHP de longue durée qui chargent le pilote.

Les extensions SQLSRV et PDO_SQLSRV peuvent être chargées indépendamment, mais installez et vérifiez les deux lorsque votre application utilise les deux pilotes. PDO est intégré dans de nombreux paquets PHP. Si le PDO n’est pas intégré, activez l’extension PDO avant PDO_SQLSRV.

Vérifiez les pilotes chargés

Pour l’exécution en ligne de commande, exécutez :

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

Sous Linux ou macOS, utilisez :

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

Pour un serveur web, restreignez l’accès à une page de diagnostic avant de créer une page temporaire contenant <?php phpinfo(); ?>. Confirmez le fichier de configuration chargé, extension_dir et les sections distinctes sqlsrv et pdo_sqlsrv. Supprimez la page après vérification.

Effectuez également une vérification au niveau PHP afin que la vérification couvre les deux API et pas seulement les noms des modules. Enregistrez ce programme sous 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);

Exécutez le programme avec chaque exécutable PHP utilisé par votre application :

php verify-php-drivers.php

Sortie attendue :

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

Pour un environnement d’exécution web, placez temporairement le fichier dans la racine du document et accédez-y dans un navigateur. Supprimez-le après vérification. Ce programme n’ouvre pas de connexion à la base de données ni n’imprime les valeurs de configuration.

Supprime verify-php-drivers.php après avoir terminé les vérifications de CLI et d’exécution web.

Dépannage du chargement du pilote

Symptôme Cause de la vérification Mesure corrective
Unable to load dynamic library Mauvais nom de fichier, extension_dirmauvaise version mineure PHP, architecture ou mode de sécurité de thread Comparez php -i avec le fichier de pilotes sélectionné et utilisez temporairement un chemin absolu pour isoler les erreurs de chemin
The specified module could not be found dans un environnement Windows La DLL du pilote ou l’une de ses dépendances n’est pas disponible Confirmez que la DLL est dans extension_dir, installez le runtime Visual C++ correspondant, et inspectez toute dépendance DLL manquante
undefined symbol ou erreur de bibliothèque partagée sous Linux ou macOS Incompatibilité entre l’extension et le build PHP, ou dépendance ODBC manquante Reconstruisez avec l’élément prévu php-config, puis inspectez la bibliothèque manquante signalée
Module "sqlsrv" is already loaded Entrées en double ou deux fichiers numérisés Recherchez l’élément chargé php.ini et le répertoire d’analyse, puis conservez une entrée
could not find driver de PDO PDO_SQLSRV n’est pas chargé, ou le PDO se charge après lui Vérifiez php --ri pdo_sqlsrv et déplacez l’entrée PDO_SQLSRV après le PDO
La ligne de commande fonctionne mais les requêtes web échouent Configuration SAPI différente ou processus qui n’a pas été relancé Comparez les valeurs de CLI et phpinfo() de configuration, modifiez la configuration web, puis redémarrez le processus web
Anciens éléments restants après une mise à niveau La configuration fait toujours référence à un fichier de version plus ancienne Remplacez l’ancienne entrée par le fichier installé par la méthode sélectionnée, supprimez les doublons, et redémarrez tous les processus PHP

PHP gère la découverte des extensions et l’ordre de chargement. PIE ou une copie manuelle fournissent le fichier d’extension. Le chargeur du système d’exploitation résout les dépendances natives. Le pilote Microsoft ODBC gère le protocole de base de données après le chargement de l’extension.