CentOS7下PHP7访问MSSqlServer

其实大多数情况下,是不会出现这种用法的,毕竟MSSqlServer对Linux不友好,且驱动不开源,大家用MySql,MariaDB,PostgreSQL,Oracle,DB2这样的比较多。但是因为特殊需要,要从另一台应用服务器读取MSSQLServer的数据来用,所以需要解决这个问题。

其实解决问题有几种思路:

1. 通过DTS类似办法同步数据,直接将SQLServer的数据实时同步到MYSQL下,PHP直接用。

2. 让MSSQLServer的应用提供Web接口,PHP调用接口服务获取数据来用。

3. 直接添加PHP以及Linux下的SqlServer的驱动,直接让PHP连接MSSQLServer数据库。


方法1:优点是好实现。这个真的很简单吧,现成的DTS工具,或者写个系统服务都可以实现。缺点也很明显,一旦任何一个服务器出点问题,那么数据不同步,后期可能存在运维成本。

方法2:优点好实现。这个也没啥说的,两边写个接口,传下JSON数据好了。缺点是效率慢,毕竟一边读取数据后,还得序列化成JSON,另一边要通过网络接收数据,还得反序列化出来,效率是硬伤。

方法3:优点是速度快,毕竟直接连数据库。缺点是配置麻烦。需要手动添加MSSQLServer驱动,扩展php对sqlserver的PDO的支持。


最后综合考虑了下,决定还是用方法3来实现。

经过了解,需要用到unixODBC,FreeTDS,还有pdo_sqlsrv扩展包。

unixODBC可以通过yum源安装。

yum install unixODBC unixODBC-devel

或者干脆 yum install unixODBC*  

yum安装和编译安装区别在于配置文件的位置。

yum安装的配置文件位于/etc目录下,编译安装位于安装目录下,一般在/usr/local/unixODBC这样的目录下。看具体编译参数了。

然后安装freeTDS

下载地址:ftp://ftp.freetds.org/pub/freetds/stable/

根据需要下载对应版本。这里用的目前最新的0.91版

tar xzf freetds-0.91.tar.gz

cd freetds-0.91

./configure --with-tdsver=8.0  

这里由于是yum源安装的unixODBC,所以上面配置就可以。如果是源码安装的,请指定unixODBC位置,如:--with-unixodbc=/usr/local 

make && make install

完成FreeTDS安装。

然后配置ODBC数据源。

向unixODBC 登记 FreeTDS 驱动

    修改 /etc/odbcinst.ini (或者/usr/local/etc/odbcinst.ini) 这里是yum安装和源码安装的区别,一定注意位置。

添加配置

[MSSQL]
Description     = ODBC of FreeTDS for MS SQL Server
Driver          = /usr/local/lib/libtdsodbc.so
Setup           = /usr/local/lib/libtds.so

FileUsage       = 1

这里要注意路径,如果按照本文默认安装,一般位置就是这样了。都在/usr/local下,但是如果自行修改过,请仔细确认。

 在 FreeTDS 的配置文件中添加指向具体数据库的访问信息

     修改 /usr/local/etc/freetds.conf

[MSSQLSERVER]
host = 192.168.0.5    ; MS SQL Server 的 IP 或者域名
port = 1433
tds version = 8.0

client charset = UTF-8  ; 客户端软件可识别的字符集.

首先确认能够ping通mssql服务器,确认1433是否打开,这里一般是mssql服务器防火墙是否打开1433端口。一般除非极为严格环境,linux的无需特别设置,但是如果不通,请确认iptable或者firewalld中是否禁用了1433.

字符集的话,一般UTF-8都没问题,如果数据库用的UTF-16或者UTF-32那么会出问题,目前FreeTDS不支持。GB2312这样的确认没问题。

修改 /etc/odbc.ini (如果odbc是从源码安装,则 /usr/local/etc/odbc.ini。odbc.ini有可能不存在,直接根据路径创建文件即可)

[MSSQL]
Driver          = /usr/local/lib/libtdsodbc.so
Description     = MSSQLServer
Trace           = No
Server          = 192.168.0.5     ; 可以直接写数据库服务器的访问信息
Database        = MyTESTDB
Port            = 1433
TDS_Version     = 8.0

[Default]

Driver          = /usr/local/freetds/lib/libtdsodbc.so

然后测试一下

tsql -S MSSQL -U sa -P [password]  回车

再次输入密码

如果出现1>则表示联通了,如果持续上涨数值,说明连接有问题,请逐一确认上述步骤。

use MyTestDB

go

select * from tb_user

go

如果能够查询到数据,说明驱动没问题了。接下来安装php扩展。

据说php5.6等老版本默认带mssql的扩展,但是我的php7.1没有,所以手动下载了驱动

pdo_sqlsrv扩展包 http://pecl.php.net/package/pdo_sqlsrv

我下的4.3.0

tar -zxvf pdo_sqlsrv-4.3.0.tgz

cd pdo_sqlsrv-4.3.0

/usr/local/php/bin/phpize    

这里要看php安装目录,我这里编译安装的,位置如上,如果找不到phpize,请确认php安装路径,相应调整。

./configure --with-php-config=/usr/local/php/bin/php-config

配置同样需要确认php路径

make && make install

完成安装即可

然后开启php中的扩展。

修改php.ini,位置根据安装及配置自行确认。

extension = pdo_sqlsrv.so

在扩展位置,加上或者开启上述扩展配置。

重启apache2或者ngix,然后开phpinfo,确认pdo配置结中pdo driver中有sqlsrv即可。

然后再php中就可以用pdo方式连接mssql了。






你可能感兴趣的:(Linux)