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
下载源码按照网站说明编译。编译参数:
Shell代码- 1../configure --prefix=/usr/local/freetds --with-tdsver=7.1 --enable-msdblib
- 2.make
- 3.make install
- ./configure --prefix=/usr/local/freetds --with-tdsver=7.1 --enable-msdblib
- make
- make install
复制代码 安装后执行/usr/local/freetds/bin/tsql -C,显示如下信息表示安装成功。
Shell代码- 1.Compile-time settings (established with the "configure" script)
- 2. Version: freetds v0.91
- 3. freetds.conf directory: /usr/local/freetds/etc
- 4. MS db-lib source compatibility: yes
- 5. Sybase binary compatibility: no
- 6. Thread safety: yes
- 7. iconv library: yes
- 8. TDS version: 7.1
- 9. iODBC: no
- 10. unixodbc: no
- 11. SSPI "trusted" logins: no
- 12. Kerberos: no
- 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,在原编译参数下增加如下参数
Shell代码- 1.--with-mssql=/usr/local/freetds
- --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代码- 1.<?php
- 2.print_r(get_extension_funcs('sybase-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扩展模块的所有函数注册都在这个文件中,找到如下记录:
Cpp代码- 1.PHP_FALIAS(mssql_connect, sybase_connect, NULL)
- 2....
- 3.PHP_FALIAS(mssql_deadlock_retry_count, sybase_deadlock_retry_count, NULL)
- PHP_FALIAS(mssql_connect, sybase_connect, NULL)
- ...
- PHP_FALIAS(mssql_deadlock_retry_count, sybase_deadlock_retry_count, NULL)
复制代码 于是试着将mssql_开头的函数都注释掉。保存。
开始编译php,编译参数同时增加sybase和mssql的支持:
Shell代码- 1.--with-sybase-ct=/opt/sybase/OCS-15_0
- 2.--with-mssql=/usr/local/freetds
- --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中配置服务器信息
|