para - php sql server linux
Linux-PHP 7.0 y MSSQL(Microsoft SQL) (8)
Definitivamente estoy de acuerdo contigo. Trabajo principalmente con servidores SQL en el trabajo y no entiendo por qué no incluyen controladores predeterminados para servidores SQL en PHP.
Para linux, no estoy muy seguro de lo que usaba anteriormente, pero descubrí que el controlador "dblib" es el mejor controlador para conectarse a servidores SQL.
Pero básicamente para una caja de linux solo desea ejecutar estos pocos pasos para tener instalado un controlador de servidor sql.
apt-get install freetds-dev -y
vim /etc/freetds.conf
¡Entonces continúe y agregue sus conexiones allí y reinicie apache y debería estar listo para continuar!
Sí, sé que PHP 7.0 eliminó las extensiones necesarias para conectarse a MSSQL. FreeTDS fue mi opción antes de PHP 7.0, pero ahora realmente no existe una ruta de actualización obvia para aquellos que necesitan conectarse a MSSQL.
Pregunta estúpida, pero dado que MSSQL es muy bien utilizado en entornos empresariales, ¿cómo se supone que debemos conectarnos a esas bases de datos que comienzan con PHP 7.0?
¿Estoy pasando por alto algo descaradamente obvio o el lanzamiento de PHP 7 básicamente le dio una bofetada a cualquiera que necesite conectarse a MSSQL?
Para mayor claridad, NO estoy hablando de conectarme desde un servidor Windows que ejecuta PHP, necesito conectarme a MSSQL desde un servidor Linux y, por lo tanto, necesitaría un controlador ODBC de Linux.
¿Alguien hace algo que funciona con MSSQL 2012 y PHP 7.0 que se puede obtener libremente o por una tarifa?
Es extraño para mí que no haya mucha información de PHP 7 y MSSQL disponible. Concedido que PHP 7 está recién salido de las imprentas, pero tiene que haber más tiendas MSSQL (FWIW usamos ambas).
El sybase de PHP7 contiene el módulo pdo_dblib.
sudo apt install php7.0-sybase
La extensión oficial de MS tiene una sucursal para PHP 7:
- https://github.com/Azure/msphpsql/tree/PHP-7.0 (Windows)
- https://github.com/Microsoft/msphpsql/tree/PHP-7.0-Linux
Todavía faltan muchas cosas, algunas están marcadas como planeadas (el soporte de Linux está entre ellas), sin embargo, podría ser otra solución en el futuro.
EDITAR (09-09-2016): Ya se habían publicado pocos lanzamientos de Linux desde marzo, con paquetes específicos de CentOS / Ubuntu y fuentes disponibles. Tenga en cuenta que aún no están marcados como Producción lista.
Microsoft tiene controladores PHP Linux para SQL Server para PHP 7 y superior en PECL. Estos están listos para producción. Para descargarlos, sigue estos pasos:
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*||"`
Esto instalará los controladores PHP SQL Server y los registrará en la carpeta php.ini.
Verifique que funcione utilizando la siguiente muestra
<?php
$serverName = "localhost";
$connectionOptions = array(
"Database" => "SampleDB",
"Uid" => "sa",
"PWD" => "your_password"
);
//Establishes the connection
$conn = sqlsrv_connect($serverName, $connectionOptions);
if($conn)
echo "Connected!"
?>
Enlaces para referencia:
Según la respuesta anterior, los pasos generan un objeto compartido (* .so) por lo que el archivo php.ini también necesita la extensión del archivo.
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*||"`
Un pequeño vertedero para la gente de 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
Yo modifiqué
yum install freetds-dev
vim /etc/freetds.conf
Y modifique freetds.conf, instale el módulo php mssql
yum install php-mssql.x86_64
tldr; Las extensiones sqlsrv y pdo_sqlsrv php fueron muy lentas con grandes consultas con muchos parámetros, pero instalar y usar pdo-dblib resolvió el problema para mí.
Ejecutando en php framework laravel 5.1 y 5.6 (en php 7.1 y 7.2) en Ubunutu 16.04. Descubrí que los paquetes sqlsrv y pdo_sqlsrv no funcionaban bien para consultas grandes. Tuve una consulta grande con 30 variables enlazadas. Sql Server 2008 convirtió todas las variables vinculadas a nvarchar (4000), lo que hace que la base de datos haga muchas cargas de conversión para siempre.
Luego deshabilito las extensiones sqlsrv.so y pdo_sqlsrv.so e instalé la extensión pdo-dblib con:
sudo apt-get install php7.2-pdo-dblib
Entonces la consulta procesó mucho más rápido.
Para más información:
Debajo del capó, laravel usa un PDOStatement como este:
$conn = new PDO( "dblib:host=$host:1433;dbname=$db;", $uid, $pwd);
$stmt = $conn->prepare( $query );
$stmt->execute($param);
donde una consulta directa como
$conn = new PDO( "dblib:host=$host:1433;dbname=$db;", $uid, $pwd);
$results = $conn->query( $query_with_parameter_already_bound );
funcionaría bien