php在Linux下同时连接Sybase和SqlServer

阅读更多

系统环境

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/

用户手册: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时发现提示如下警告信息:

 

警告信息 写道
[10-Dec-2011 15:08:31] PHP Warning: Function registration failed - duplicate name - mssql_connect in Unknown on line 0
[10-Dec-2011 15:08:31] PHP Warning: Function registration failed - duplicate name - mssql_pconnect in Unknown on line 0
[10-Dec-2011 15:08:31] PHP Warning: Function registration failed - duplicate name - mssql_close in Unknown on line 0
[10-Dec-2011 15:08:31] PHP Warning: Function registration failed - duplicate name - mssql_select_db in Unknown on line 0
[10-Dec-2011 15:08:31] PHP Warning: Function registration failed - duplicate name - mssql_query in Unknown on line 0
[10-Dec-2011 15:08:31] PHP Warning: Function registration failed - duplicate name - mssql_free_result in Unknown on line 0
[10-Dec-2011 15:08:31] PHP Warning: Function registration failed - duplicate name - mssql_get_last_message in Unknown on line 0
.......

[10-Dec-2011 15:08:34] PHP Warning: Function registration failed - duplicate name - mssql_fetch_array in Unknown on line 0
[10-Dec-2011 15:08:34] PHP Warning: Function registration failed - duplicate name - mssql_fetch_object in Unknown on line 0
[10-Dec-2011 15:08:34] PHP Warning: Function registration failed - duplicate name - mssql_data_seek in Unknown on line 0
[10-Dec-2011 15:08:34] PHP Warning: Function registration failed - duplicate name - mssql_field_seek in Unknown on line 0

 

 

没在意此提示,继续看phpinfo。发现mssql和sybase已经都支持了。

编写测试代码链接mssql。发现始终无法连接。开始google查找总结如下:

sybase和mssql最早同出一族在php中函数通用。同时在freetds中也发现可以使用mssql_connnect同时连接sybase和msssql数据库。为证实此说法,编写php文件打印sybse-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中配置服务器信息

 

 

你可能感兴趣的:(php,sybase,mssql,freetds)