ODBC, Pdo SQL Server sur Debian 11

Classé dans : Linux, Programmation | 0

Dans ce petit tuto vous trouverez le détail des manipulations à réaliser pour installer et configurer les drivers ODBC et SQL server pour PHP 8 sur une distribution Debian 11

Je pars du principe que PHP est installé et fonctionnement correctement. Seul l’ajout des drivers OBDC et pdo_sqlsrv et détaillé.

Nb : Il se peut que certains paquets soient déja présents sur votre Debian.

Une grande partie des informations ici présentent sont sur le site Microsoft sur les pages

https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server

https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server

Installation des drivers ODBC

apt-get install gnupg wget 
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list
apt-get update
ACCEPT_EULA=Y apt-get install -y msodbcsql18 unixodbc-dev  

Installation module sqlsrv

pecl install sqlsrv

Installation module pdo_sqlsrv

pecl install pdo_sqlsrv

Mise à jour php.ini

Afin de charger les 2 modules il faut les ajouter dans votre php.ini

Ajouter les lignes suivantes :

extension=sqlsrv.so
extension=pdo_sqlsrv.so

Vérification

Pour contrôler le bon fonctionnement il faut d’abord relancer apache : service apache2 restart

Ensuite créez une page info.php avec le code suivant (page accessible via apache) :

<?
print phpinfo();

Ouvrer cette page dans votre navigateur vous devriez trouver deux sections concernant les nouveaux modules ajoutés

Erreur Protocol SSL

Il est possible qu’une erreur SSL aparaisse si votre serveur SQL est ancien. C’est ce qui m’est arrivé.

Pour corriger cela il faut modifier la config openssl sur votre Debian pour accepter une version plus ancienne du protocol. Pour cela éditez le fichier /etc/ssl/openssl.cnf

Recherchez la ligne MinProtocol = TLSv1.x et remplacer par MinProtocol = TLSv1.0

Il est possible de faire cela avec une commande sed

cd /etc/ssl
sed -i "s/TLSv1.2/TLSv1.0/g" openssl.cnf

Bonus : création container Docker

En bonus je vous livre mes scripts pour créer une image Docker avec cette configuration et Apache + PHP 8.

Dockerfile

## PHP 8.2.4 / Apache 2.4.53

FROM php:apache
## commande pour compléter l'image par défaut
RUN apt-get update
RUN apt-get install --no-install-recommends -y vim inetutils-ping gnupg 
RUN apt-get install -y --no-install-recommends libldap2-dev 
RUN apt-get install -y --no-install-recommends libzip4 
RUN apt-get install -y --no-install-recommends libzip-dev

## bug fichier manquant sur la distrib 
COPY ./libltdl.la /usr/lib/x86_64-linux-gnu/. 
## script installation driver ODBC + pdo SQL pour PHP 
COPY ./sqlsrv.sh /usr/local/bin/.
RUN chmod +x /usr/local/bin/sqlsrv.sh  
## exec du script
RUN /usr/local/bin/sqlsrv.sh

RUN a2enmod rewrite
RUN docker-php-ext-install mysqli
RUN docker-php-ext-install pdo_mysql
RUN docker-php-ext-install ldap 
RUN docker-php-ext-install zip

EXPOSE 80

sqlsrv.sh

#!/bin/bash

curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list
apt-get update 
ACCEPT_EULA=Y apt-get install -y msodbcsql18 unixodbc-dev msodbcsql18

## compil ext php sqlsrv 
pecl install sqlsrv

# compil ext php pdo_sqlsrv
pecl install pdo_sqlsrv

# Modif SSL pour accepter version 1.0 de TLS
cd /etc/ssl && sed -i "s/TLSv1.2/TLSv1.0/g" openssl.cnf

libltdl.la

# Fichier libldtl.la, voir DockerFile pour bug fichier manquant
# libltdl.la - a libtool library file
# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.11+b1
#
# Please DO NOT delete this file!
# It is necessary for linking the library.

# The name that we can dlopen(3).
dlname='libltdl.so.7'

# Names of this library.
library_names='libltdl.so.7.3.0 libltdl.so.7 libltdl.so'

# The name of the static archive.
old_library='libltdl.a'

# Linker flags that can not go in dependency_libs.
inherited_linker_flags=''

# Libraries that this one depends upon.
dependency_libs=' -ldl'

# Names of additional weak libraries provided by this library
weak_library_names=''

# Version information for libltdl.
current=10
age=3
revision=0

# Is this an already installed library?
installed=yes

# Should we warn about portability when linking against -modules?
shouldnotlink=no

# Files to dlopen/dlpreopen
dlopen=''
dlpreopen=''

# Directory that this library needs to be installed in:
libdir='/usr/lib/x86_64-linux-gnu'