web-dev-qa-db-fra.com

Linux - PHP 7.0 et MSSQL (Microsoft SQL)

Oui, je sais que PHP 7.0 a supprimé les extensions nécessaires pour se connecter à MSSQL. FreeTDS était mon option avant PHP 7.0, mais il n’existe à présent aucun moyen de mise à niveau évident pour ceux qui doivent encore se connecter à MSSQL.

Question stupide, mais étant donné que MSSQL est très certainement bien utilisé dans les environnements d'entreprise, comment sommes-nous censés nous connecter à ces bases de données commençant par PHP 7.0?

Suis-je en train de négliger quelque chose de flagrant ou est-ce que la sortie de PHP 7 a fondamentalement giflé toute personne ayant besoin de se connecter à MSSQL?

Pour plus de clarté, NOT parle de connexion à partir d'un serveur Windows exécutant PHP. J'ai besoin de me connecter à MSSQL à partir d'un serveur Linux. Il me faudrait donc un pilote Linux ODBC.

Est-ce que quelqu'un fabrique une telle chose qui fonctionne avec MSSQL 2012 et PHP 7.0 et qui peut être utilisée librement ou contre paiement?

Il est étrange pour moi qu'il n'y ait pas beaucoup PHP 7 et informations MSSQL à avoir là-bas. Certes, PHP 7 vient tout juste d'être imprimé, mais il doit y avoir davantage de magasins MSSQL (nous utilisons les deux à la fois).

38
Donavon Yelton

Microsoft possède PHP pilotes Linux pour SQL Server pour PHP 7 et versions ultérieures sur PECL. Ce sont prêts pour la production. Pour les télécharger, procédez comme suit:

Ubuntu 16.04:

Sudo su 
curl https://packages.Microsoft.com/keys/Microsoft.asc | apt-key add -
curl https://packages.Microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
exit
Sudo apt-get update
Sudo ACCEPT_EULA=Y apt-get install -y msodbcsql mssql-tools unixodbc-dev
Sudo pecl install sqlsrv
Sudo pecl install pdo_sqlsrv
echo "extension=sqlsrv" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`
echo "extension=pdo_sqlsrv" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`

CentOS 7:

Sudo su
curl https://packages.Microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo
exit
Sudo yum update
Sudo ACCEPT_EULA=Y yum install -y msodbcsql mssql-tools unixODBC-devel 
Sudo yum groupinstall "Development Tools"
Sudo pecl install sqlsrv
Sudo pecl install pdo_sqlsrv
echo "extension=sqlsrv" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`
echo "extension=pdo_sqlsrv" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`

Cela installera les PHP pilotes SQL Server et les enregistrera dans le dossier php.ini. 

Vérifiez que cela fonctionne en utilisant l'exemple suivant

<?php
$serverName = "localhost";
$connectionOptions = array(
    "Database" => "SampleDB",
    "Uid" => "sa",
    "PWD" => "your_password"
);
//Establishes the connection
$conn = sqlsrv_connect($serverName, $connectionOptions);
if($conn)
    echo "Connected!"
?>

Liens pour référence:

30
meet-bhagdev

La sybase de PHP7 contient le module pdo_dblib.

Sudo apt install php7.0-sybase
18
shrty

tldr; sqlsrv et pdo_sqlsrv Les extensions PHP étaient très lentes avec des requêtes volumineuses comportant de nombreux paramètres, mais l'installation et l'utilisation de pdo-dblib ont résolu le problème pour moi.

Fonctionnant sur le framework php laravel 5.1 et 5.6 (sur les php 7.1 et 7.2) sur Ubunutu 16.04. J'ai constaté que les packages sqlsrv et pdo_sqlsrv ne fonctionnaient pas correctement pour les requêtes volumineuses. J'ai eu une grande requête avec 30 variables liées. Sql Server 2008 a converti toutes les variables liées en nvarchar (4000), ce qui a obligé la base de données à exécuter des charges de conversion d'une durée indéfinie.

J'ai ensuite désactivé les extensions sqlsrv.so et pdo_sqlsrv.so et installé l'extension pdo-dblib avec:

Sudo apt-get install php7.2-pdo-dblib

Ensuite, la requête a été traitée beaucoup plus rapidement.

Pour plus d'informations:

Sous le capot, Laravel utilise un PDOStatement comme celui-ci:

$conn = new PDO( "dblib:Host=$Host:1433;dbname=$db;", $uid, $pwd);
$stmt = $conn->prepare( $query );
$stmt->execute($param);

où une requête directe comme 

$conn = new PDO( "dblib:Host=$Host:1433;dbname=$db;", $uid, $pwd);
$results = $conn->query( $query_with_parameter_already_bound );

fonctionnerait bien.

8
grizzb

L'extension officielle MS a une branche pour PHP 7:

Il manque encore beaucoup de choses, certaines marquées comme prévu (le support Linux en fait partie), néanmoins cela pourrait être une autre solution dans le futur.

EDIT (09-09-2016): Peu de versions de Linux ont déjà été publiées depuis mars, avec des paquets et des sources spécifiques à CentOS/Ubuntu. Gardez à l'esprit qu'ils ne sont pas encore marqués comme Prêt pour la production.

5
bjauy

Je suis certainement d'accord avec vous. Je travaille principalement avec les serveurs SQL au travail et je ne comprends pas pourquoi ils n'incluent pas les pilotes par défaut pour les serveurs SQL en PHP.

Pour Linux, je ne suis pas trop sûr de ce que vous avez utilisé auparavant, mais j’ai constaté que le pilote "dblib" est le meilleur pilote pour la connexion aux serveurs SQL.

Mais fondamentalement, pour une boîte Linux, vous voulez juste exécuter ces quelques étapes pour avoir un pilote de serveur SQL installé.

apt-get install freetds-dev -y
vim /etc/freetds.conf

Alors allez-y et ajoutez vos connexions là-bas et redémarrez Apache et vous devriez être prêt à partir!

4
Jordan

Comme indiqué dans la réponse ci-dessus - les étapes produisent un objet partagé (* .so), de sorte que le fichier php.ini nécessite également l'extension du fichier. 

echo "extension=sqlsrv.so" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`
echo "extension=pdo_sqlsrv.so" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`
1
Joes5

J'ai modifié

yum install freetds-dev
vim /etc/freetds.conf

Et modifier freetds.conf, installer le module php mssql

yum install php-mssql.x86_64
0
Caat c

Un court dump pour le peuple Debian: 

# Install MSSQL Client for PHP7 on Debian 9
apt update && apt install curl apt-transport-https
curl https://packages.Microsoft.com/keys/Microsoft.asc | apt-key add -
curl https://packages.Microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list
apt update
ACCEPT_EULA=Y apt install msodbcsql17 mssql-tools unixodbc-dev php-pear php7.0-dev
pecl install sqlsrv
pecl install pdo_sqlsrv
# if previous pecl cmds fails to download files at it's own - try the following ones:
#wget http://pecl.php.net/get/sqlsrv-5.2.0.tgz
#wget http://pecl.php.net/get/pdo_sqlsrv-5.2.0.tgz
#pecl install sqlsrv-5.2.0.tgz
#pecl install pdo_sqlsrv-5.2.0.tgz

cat <<EOF > /etc/php/7.0/cli/conf.d/99-sqlsrv.ini  
extension=sqlsrv.so
extension=pdo_sqlsrv.so
EOF
cat <<EOF > /etc/php/7.0/Apache2/conf.d/99-sqlsrv.ini  
extension=sqlsrv.so
extension=pdo_sqlsrv.so
EOF

service Apache2 restart
0
itshorty