日期:2014-05-16  浏览次数:20782 次

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模块函数列表。

?

?

<?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_deadloc