php在Linux下同時(shí)連接Sybase和SqlServer
系統(tǒng)環(huán)境
OS:Redhat AS4.0
php:4.4.7
Apache:1.3.9
此環(huán)境為幾年前配置的版本。
php和apache為源碼編譯。之前因?yàn)樾枰B接sybase所以php已經(jīng)支持對sybase的支持。sybase版本15,編譯參數(shù):
--with-sybase-ct=/opt/sybase/OCS-15_0
最近程序需要連接SQL SERVER2000,所以要再次基礎(chǔ)上增加mssql的支持。首先想到的是freetds。
官方網(wǎng)站:http://www.freetds.org/
用戶手冊:http://www.freetds.org/userguide
下載源碼按照網(wǎng)站說明編譯。編譯參數(shù):
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
復(fù)制代碼 安裝后執(zhí)行/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
復(fù)制代碼 接下來重新編譯php,在原編譯參數(shù)下增加如下參數(shù)
Shell代碼- 1.--with-mssql=/usr/local/freetds
- --with-mssql=/usr/local/freetds
復(fù)制代碼 繼續(xù)make && make install
在make install時(shí)發(fā)現(xiàn)提示如下警告信息:
警告信息 寫道
[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
沒在意此提示,繼續(xù)看phpinfo。發(fā)現(xiàn)mssql和sybase已經(jīng)都支持了。
編寫測試代碼鏈接mssql。發(fā)現(xiàn)始終無法連接。開始google查找總結(jié)如下:
sybase和mssql最早同出一族在php中函數(shù)通用。同時(shí)在freetds中也發(fā)現(xiàn)可以使用mssql_connnect同時(shí)連接sybase和msssql數(shù)據(jù)庫。為證實(shí)此說法,編寫php文件打印sybse-ct模塊函數(shù)列表。
Php代碼- 1.<?php
- 2.print_r(get_extension_funcs('sybase-ct'));
- <?php
- print_r(get_extension_funcs('sybase-ct'));
復(fù)制代碼 在執(zhí)行頁面發(fā)現(xiàn)打印出來sybase和mssql的所有函數(shù)。所以在php編譯安裝時(shí)會提示上面顯示的那些警告信息。就是說sybase模塊支持中已經(jīng)增加了mssql的函數(shù)支持。那么是不是不需要mssql的模塊是不是也可以連接mssql呢?接著重新編譯php去掉php的mssql的模塊。使用mssql函數(shù),發(fā)現(xiàn)函數(shù)是能用。但是就是無法連接到指定的mssql。可能是我這里的配置問題。調(diào)整了很多參數(shù)還是連不上。
最終放棄了這個(gè)做法。使用freetds同時(shí)連接sybase和mssql。繼續(xù)重新編譯。寫代碼測試發(fā)現(xiàn)還是不行(2個(gè)不能同時(shí)都好使)。那么有沒有第三種方法呢?google也沒有發(fā)現(xiàn),自己思考是否可以各自使用自己的函數(shù),互不影響。sybase繼續(xù)使用原來的/opt/sybase/OCS-15_0,sqlserver使用freetds呢。
開始嘗試,首先要看php的sybase擴(kuò)展模塊代碼。
打開/opt/php/php4.4.7/ext/sybase_ct/php_sybase_ct.c,終于有發(fā)現(xiàn)。
sybase擴(kuò)展模塊的所有函數(shù)注冊都在這個(gè)文件中,找到如下記錄:
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)
復(fù)制代碼 于是試著將mssql_開頭的函數(shù)都注釋掉。保存。
開始編譯php,編譯參數(shù)同時(shí)增加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
復(fù)制代碼 繼續(xù)
make && make install。
這次沒有提示警告信息。暗喜!
編寫測試代碼測試。sybase和mssql都可以連接。終于成功了。
附:
sybase連接需要在/opt/sybase/interfac中配置服務(wù)器信息
mssql鏈接需要在/usr/local/freetds/etc/freetds.conf中配置服務(wù)器信息
|