免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2335 | 回复: 1

php在Linux下同时连接Sybase和SqlServer [复制链接]

论坛徽章:
0
发表于 2012-01-06 16:04 |显示全部楼层
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. 1../configure --prefix=/usr/local/freetds --with-tdsver=7.1 --enable-msdblib   
  2. 2.make   
  3. 3.make install  
  4. ./configure --prefix=/usr/local/freetds --with-tdsver=7.1 --enable-msdblib
  5. make
  6. make install  
复制代码
安装后执行/usr/local/freetds/bin/tsql -C,显示如下信息表示安装成功。





Shell代码
  1. 1.Compile-time settings (established with the "configure" script)   
  2. 2.                            Version: freetds v0.91  
  3. 3.             freetds.conf directory: /usr/local/freetds/etc   
  4. 4.     MS db-lib source compatibility: yes   
  5. 5.        Sybase binary compatibility: no   
  6. 6.                      Thread safety: yes   
  7. 7.                      iconv library: yes   
  8. 8.                        TDS version: 7.1  
  9. 9.                              iODBC: no   
  10. 10.                           unixodbc: no   
  11. 11.              SSPI "trusted" logins: no   
  12. 12.                           Kerberos: no  
  13. Compile-time settings (established with the "configure" script)
  14.                             Version: freetds v0.91
  15.              freetds.conf directory: /usr/local/freetds/etc
  16.      MS db-lib source compatibility: yes
  17.         Sybase binary compatibility: no
  18.                       Thread safety: yes
  19.                       iconv library: yes
  20.                         TDS version: 7.1
  21.                               iODBC: no
  22.                            unixodbc: no
  23.               SSPI "trusted" logins: no
  24.                            Kerberos: no
复制代码
接下来重新编译php,在原编译参数下增加如下参数





Shell代码
  1. 1.--with-mssql=/usr/local/freetds  
  2. --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. 1.<?php   
  2. 2.print_r(get_extension_funcs('sybase-ct'));  
  3. <?php
  4. 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. 1.PHP_FALIAS(mssql_connect, sybase_connect, NULL)   
  2. 2....   
  3. 3.PHP_FALIAS(mssql_deadlock_retry_count, sybase_deadlock_retry_count, NULL)  
  4. PHP_FALIAS(mssql_connect, sybase_connect, NULL)
  5. ...
  6. PHP_FALIAS(mssql_deadlock_retry_count, sybase_deadlock_retry_count, NULL)
复制代码
于是试着将mssql_开头的函数都注释掉。保存。

开始编译php,编译参数同时增加sybase和mssql的支持:





Shell代码
  1. 1.--with-sybase-ct=/opt/sybase/OCS-15_0   
  2. 2.--with-mssql=/usr/local/freetds  
  3. --with-sybase-ct=/opt/sybase/OCS-15_0
  4. --with-mssql=/usr/local/freetds
复制代码
继续

make && make install。

这次没有提示警告信息。暗喜!

编写测试代码测试。sybase和mssql都可以连接。终于成功了。



附:

sybase连接需要在/opt/sybase/interfac中配置服务器信息

mssql链接需要在/usr/local/freetds/etc/freetds.conf中配置服务器信息

论坛徽章:
0
发表于 2012-01-06 16:05 |显示全部楼层
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP