linux版本:64位CentOS 6.4

Nginx版本:nginx1.8.0

php版本:php5.5.28

Sqlserver:2008

关于Linux环境安装Nginx+PHP参考《Linux环境Nginx安装与调试以及PHP安装 》即可。一般来说,PHP+mysql是最经典的组合,跑在Linux环境是非常好的,如果是PHP+Sqlserver是跑在windows环境下的。

今天需要Linux环境下PHP调用Sqlserver,用了一天的时间,终于把这个问题彻底研究清楚,网上其他类似文章我大都看了,其实有的是因为太久远不适用,有的有错误,还有的有几个关键问题没有说清楚,看此文其他可以忽略了,说真的踩坑真的很累,也没必要,照着这篇来做就是,所以本文才号称是全网最经典无错版,其实这么说主要是希望大家节省时间。

1.首先需要编译安装FreeTDS

说明:FreeTDS官网下载比较慢,可以从本人上传的这里一样很快下载:http://download.csdn.net/detail/21aspnet/8997397

# wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-patched.tar.gz
# tar -zxvf freetds-0.91.tar.gz
# cd freetds-0.91

需要注意的就是这里的--with-tdsver=7.1,这个非常重要,网上有的说是7.2,有的说是8.0,关于这个的问题可以看文末参考帖子

# ./configure --prefix=/usr/local/freetds --with-tdsver=7.1 --enable-msdblib
# make && make install

安装好会看到这样的信息:

Linux环境PHP5.5以上连接SqlServer2008_第1张图片

 

配置FreeTDS

# cd ../

# echo "/usr/local/freetds/lib/" > /etc/ld.so.conf.d/freetds.conf
   # ldconfig

验证FreeTDS

这一步非常重要,通过才可以继续,不然后面的步骤都是无意义的。

首先看看版本信息

# /usr/local/freetds/bin/tsql -C

Linux环境PHP5.5以上连接SqlServer2008_第2张图片

如果前面配置的时候--with-tdsver=7.1如果写的是7.2和8.0或者其他都会这里TDS版本是5.0,原因见后面的参考信息中的帖子。

# /usr/local/freetds/bin/tsql -H 数据库服务器IP:XXX -p 1433 -U 用户名 -P 密码

或者直接

# /usr/local/freetds/bin/tsql -H 数据库服务器IP -p 1433 -U 用户名 -P 密码

Linux环境PHP5.5以上连接SqlServer2008_第3张图片

关于freetds/etc/freetds.conf  下面可以参考线上可以不配置

重要说明:很多其他帖子写了需要配置/usr/local/freetds/etc/freetds.conf,另外需要注意的是etc下的freetds.conf不同于前面那个freetds.conf。

其实默认已经生成好了etc下的freetds.conf,其实这是多余的,不过配置了也没有问题。 

如果配置了这里,那么PHP页面就可以使用这里的配置,不然PHP页面指定一样可以。

默认是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[ global ]
         # TDS protocol version
;   tds version = 4.2
 
     # Whether to write a TDSDUMP file for diagnostic purposes
     # (setting this to /tmp is insecure on a multi- user system)
;   dump file = /tmp/freetds.log
;   debug flags = 0xffff
 
     # Command and connection timeouts
;   timeout = 10
;   connect timeout = 10
     
     # If you get out - of -memory errors, it may mean that your client
     # is trying to allocate a huge buffer for a TEXT field. 
     # Try setting 'text size' to a more reasonable limit
     text size = 64512
 
# A typical Sybase server
[egServer50]
     host = symachine.domain.com
     port = 5000
     tds version = 5.0
 
# A typical Microsoft server
[egServer70]
     host = ntmachine.domain.com
     port = 1433
     tds version = 7.0

修改[egServer70]为这样:

?

1
2
3
4
[egServer70]
     host = 192.168.1.235 这个是数据库服务器IP
     port = 1433
     tds version = 7.1

其他都不用动,关于[egServer70]的名字也是随意的,这个就是给PHP调用的,一致即可。 

3.添加PHP扩展mssql和pdo的pdo_dblib

说明:这2种扩展都可以达到相同的目的,选其一即可。

(1).增加PHP扩展mssql 

# cd /usr/php-5.5.28/ext/mssql/

linux下用phpize给PHP动态添加扩展
# /usr/local/php/bin/phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config --with-mssql=/usr/local/freetds/
# make && make install

Linux环境PHP5.5以上连接SqlServer2008_第4张图片


(2).增加PHP扩展pdo的pdo_dblib  线上部署使用
# cd /usr/php-5.5.28/ext/pdo_dblib/ 此目录是php源文件版本文件目录下比如 lnmp/src/phpxxx/ext/pdo_dblib/ 
 下面用phpize给PHP动态添加扩展
# [root@xxx pdo_dblib]# /usr/local/php/bin/phpize 执行,此目录是php生产环境下安装的具体目录

Configuring for:

PHP Api Version:         20121113

Zend Module Api No:      20121212

Zend Extension Api No:   220121212

# ./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-dblib=/usr/local/freetds/

# make && make install 

执行完成后会有一个提示目录,这个下面就是模块so目录

 xxx/php/lib/php/extensions/no-debug-non-zts-20121212/ 

(3).在php.ini配置文件中增加.so

# cd /usr/local/php/etc下的php.ini

增加:

?

1
2
extension = "mssql.so"

extension ="pdo_dblib.so"

;   extension=/path/to/extension/msql.so

extension=xxx/php/lib/php/extensions/no-debug-non-zts-20121212/pdo_dblib.so  


如果你只需要上述2种扩展之一,自然只要新增其中一个的.so扩展到php.ini即可。

(4).重启PHP FastCGI# killall php-fpm
# /etc/init.d/php-fpm

如果没有正确生成扩展是不能重启php-fpm的。

这时候在phpinfo里就可以看到扩展添加成功的信息了。

Linux环境PHP5.5以上连接SqlServer2008_第5张图片

Linux环境PHP5.5以上连接SqlServer2008_第6张图片