系统环境
OS:Redhat AS4.0
php:4.4.7
Apache:1.3.9
此环境为几年前配置的版本。
php和apache为源码编译。之前因为需要连接sybase所以php已经支持对sybase的支持。sybase版本15,编译参数:
--with-sybase-ct=/opt/sybase/OCS-15_0
最近程序需要连接SQL SERVER2000,所以要再次基础上增加mssql的支持。首先想到的是freetds。
用户手册:http://www.freetds.org/userguide
下载源码按照网站说明编译。编译参数:
./configure --prefix=/usr/local/freetds --with-tdsver=7.1 --enable-msdblib make make install
安装后执行/usr/local/freetds/bin/tsql -C,显示如下信息表示安装成功。
Compile-time settings (established with the "configure" script) Version: freetds v0.91 freetds.conf directory: /usr/local/freetds/etc MS db-lib source compatibility: yes Sybase binary compatibility: no Thread safety: yes iconv library: yes TDS version: 7.1 iODBC: no unixodbc: no SSPI "trusted" logins: no Kerberos: no
接下来重新编译php,在原编译参数下增加如下参数
--with-mssql=/usr/local/freetds
继续make && make install
在make install时发现提示如下警告信息:
没在意此提示,继续看phpinfo。发现mssql和sybase已经都支持了。
编写测试代码链接mssql。发现始终无法连接。开始google查找总结如下:
sybase和mssql最早同出一族在php中函数通用。同时在freetds中也发现可以使用mssql_connnect同时连接sybase和msssql数据库。为证实此说法,编写php文件打印sybse-ct模块函数列表。
<?php print_r(get_extension_funcs('sybase-ct'));
在执行页面发现打印出来sybase和mssql的所有函数。所以在php编译安装时会提示上面显示的那些警告信息。就是说sybase模块支持中已经增加了mssql的函数支持。那么是不是不需要mssql的模块是不是也可以连接mssql呢?接着重新编译php去掉php的mssql的模块。使用mssql函数,发现函数是能用。但是就是无法连接到指定的mssql。可能是我这里的配置问题。调整了很多参数还是连不上。
最终放弃了这个做法。使用freetds同时连接sybase和mssql。继续重新编译。写代码测试发现还是不行(2个不能同时都好使)。那么有没有第三种方法呢?google也没有发现,自己思考是否可以各自使用自己的函数,互不影响。sybase继续使用原来的/opt/sybase/OCS-15_0,sqlserver使用freetds呢。
开始尝试,首先要看php的sybase扩展模块代码。
打开/opt/php/php4.4.7/ext/sybase_ct/php_sybase_ct.c,终于有发现。
sybase扩展模块的所有函数注册都在这个文件中,找到如下记录:
PHP_FALIAS(mssql_connect, sybase_connect, NULL) ... PHP_FALIAS(mssql_deadlock_retry_count, sybase_deadlock_retry_count, NULL)
于是试着将mssql_开头的函数都注释掉。保存。
开始编译php,编译参数同时增加sybase和mssql的支持:
--with-sybase-ct=/opt/sybase/OCS-15_0 --with-mssql=/usr/local/freetds
继续
make && make install。
这次没有提示警告信息。暗喜!
编写测试代码测试。sybase和mssql都可以连接。终于成功了。
附:
sybase连接需要在/opt/sybase/interfac中配置服务器信息
mssql链接需要在/usr/local/freetds/etc/freetds.conf中配置服务器信息