Linux環境PHP5.5以上鍊接SqlServer2008

linux版本:64位CentOS 6.4php

Nginx版本:nginx1.8.0html

php版本:php5.5.28mysql

Sqlserver版本:2008linux

FreeTDS版本:0.95
nginx

關於Linux環境安裝Nginx+PHP參考《Linux環境Nginx安裝與調試以及PHP安裝 》便可。sql

 

通常來講,PHP+mysql是最經典的組合,跑在Linux環境是很是好的,若是是PHP+Sqlserver是跑在windows環境下的。數據庫

今天須要Linux環境下PHP調用Sqlserver,用了一天的時間,終於把這個問題完全研究清楚,網上其餘相似文章我大都看了,其實有的是由於過久遠不適用,有的有錯誤,還有的有幾個關鍵問題沒有說清楚,看此文其餘能夠忽略了,說真的踩坑真的很累,也不必,照着這篇來作就是,因此本文才號稱是全網最經典無錯版,其實這麼說主要是但願你們節省時間。windows

1.首先須要編譯安裝FreeTDS服務器

說明:必定要從官網下載最新的版本FreeTDS-0.95 ftp://ftp.freetds.org/pub/freetds/stable/freetds-patched.tar.gzdom

若是官網實在太慢建議從本人上傳的這裏同樣很快下載:http://download.csdn.net/detail/21aspnet/9000357


# wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-patched.tar.gz
# tar -zxvf freetds-patched.tar.gz
# cd freetds-0.95

須要注意的就是這裏的--with-tdsver=7.3,這個很是重要,你須要根據你的數據庫版本選擇正確的配置項,因爲如今大可能是SQLserve2008因此須要選擇7.3.

關於這個問題網上有的說是7.1,也有的說是7.2,甚至有的說是8.0,能夠看文末參考帖子,不過那些說的都有問題。

形成這個配置項混亂的根源是不少人用的是FreeTDS-0.91,通過個人測試FreeTDS-0.91只支持7.1,若是是7.2以上配置那麼統統會變爲5.0。


其實參考官網的文檔就知道這個問題了,不過因爲不少人下載了舊版FreeTDS-0.91,即便設置爲--with-tdsver=7.2以上也沒有用。


總結:FreeTDS-0.91只支持7.1,其他都會默認爲5.0。只有最新的FreeTDS-0.95,也就是對Sqlserver2008的最佳配置。


# ./configure --prefix=/usr/local/freetds --with-tdsver=7.3 --enable-msdblib
# make && make install

 

安裝好會看到這樣的信息:



配置FreeTDS

cd ../

echo "/usr/local/freetds/lib/" > /etc/ld.so.conf.d/freetds.conf
ldconfig

 

驗證FreeTDS版本

這一步很是重要,經過才能夠繼續,否則後面的步驟都是無心義的。

首先看看版本信息

/usr/local/freetds/bin/tsql -C



測試數據庫是否聯通

/usr/local/freetds/bin/tsql -H 數據庫服務器IP  -p 端口號 -U 用戶名 -P 密碼

 

關於freetds/etc/freetds.conf配置項

不少其餘帖子寫了須要配置/usr/local/freetds/etc/freetds.conf,其實這個不須要配置。若是配置也能夠,配置了PHP就能夠調用這個配置項,不然須要PHP代碼裏指定數據庫服務器信息便可。

另外須要注意的是/usr/local/freetds/etc/下的freetds.conf不一樣於前面/usr/local/freetds/lib/那個freetds.conf。

若是配置了這裏,那麼PHP頁面就可使用這裏的配置,否則PHP頁面指定同樣能夠。


默認是這樣的:

[cpp] view plaincopy

  1. #   $Id: freetds.conf,v 1.12 2007-12-25 06:02:36 jklowden Exp $  

  2. #  

  3. # This file is installed by FreeTDS if no file by the same   

  4. # name is found in the installation directory.    

  5. #  

  6. # For information about the layout of this file and its settings,   

  7. # see the freetds.conf manpage "man freetds.conf".    

  8.   

  9. # Global settings are overridden by those in a database  

  10. # server specific section  

  11. [global]  

  12.         # TDS protocol version  

  13. ;   tds version = 4.2  

  14.   

  15.     # Whether to write a TDSDUMP file for diagnostic purposes  

  16.     # (setting this to /tmp is insecure on a multi-user system)  

  17. ;   dump file = /tmp/freetds.log  

  18. ;   debug flags = 0xffff  

  19.   

  20.     # Command and connection timeouts  

  21. ;   timeout = 10  

  22. ;   connect timeout = 10  

  23.       

  24.     # If you get out-of-memory errors, it may mean that your client  

  25.     # is trying to allocate a huge buffer for a TEXT field.    

  26.     # Try setting 'text size' to a more reasonable limit   

  27.     text size = 64512  

  28.   

  29. # A typical Sybase server  

  30. [egServer50]  

  31.     host = symachine.domain.com  

  32.     port = 5000  

  33.     tds version = 5.0  

  34.   

  35. # A typical Microsoft server  

  36. [egServer70]  

  37.     host = ntmachine.domain.com  

  38.     port = 1433  

  39.     tds version = 7.0  

 

若是你想使用配置項,只要修改[egServer70]便可:

[cpp] view plaincopy

  1. [egServer70]  

  2.     host = 192.168.1.235 這個是數據庫服務器IP  

  3.     port = 1433  

  4.     tds version = 7.1  

其餘都不用動,關於[egServer70]的名字也是隨意的,這個就是給PHP調用的,和PHP代碼裏一致便可。

 

3.添加PHP擴展mssql和pdo的pdo_dblib

說明:這2種擴展均可以達到相同的目的,選其一便可。

(1).增長PHP擴展mssql

cd /usr/php-5.5.28/ext/mssql/
linux下用phpize給PHP動態添加擴展
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-mssql=/usr/local/freetds/
make && make install


(2).增長PHP擴展pdo的pdo_dblib
cd /usr/php-5.5.28/ext/pdo_dblib/
linux下用phpize給PHP動態添加擴展
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-dblib=/usr/local/freetds/
make && make install

 

(3).在php.ini配置文件中增長.so
cd /usr/local/php/lib下的php.ini

增長:

[cpp] view plaincopy

  1. extension = "mssql.so"  

  2. extension ="pdo_dblib.so"  


若是你只須要上述2種擴展之一,天然只要新增其中一個的.so擴展到php.ini便可。

(4).重啓PHP FastCGI

# killall php-fpm
# /etc/init.d/php-fpm

 

若是沒有正確生成擴展是不能重啓php-fpm的。

這時候在phpinfo裏就能夠看到擴展添加成功的信息了。

4.使用PHP調用SQLserver

(1).mssql_connect配置版

[php] view plaincopy

  1. <?php  

  2. header("Content-type: text/html; charset=utf-8");  

  3. $msdb=mssql_connect("egServer70","blog.csdn.net.unix21","password");  

  4. if (!$msdb) {  

  5.     echo "connect sqlserver error";  

  6.     exit;  

  7.     }  

  8. mssql_select_db("數據庫名",$msdb);  

  9. $result = mssql_query("SELECT top 5 * FROM tablename"$msdb);  

  10. while($row = mssql_fetch_array($result)) {  

  11.  print_r($row);  

  12. }  

  13. mssql_free_result($result);  

  14. ?>  

注意:上面的egServer70就是前面freetds/etc/freetds.conf配置的。

 

(2).mssql_connect非配置版

[php] view plaincopy

  1. <?php  

  2. header("Content-type: text/html; charset=utf-8");  

  3. //$msdb=mssql_connect("數據庫IP","blog.csdn.net.unix21","password");  

  4. //$msdb=mssql_connect("數據庫IP:1433","blog.csdn.net.unix21","password");  

  5. $msdb=mssql_connect("數據庫IP:49151","blog.csdn.net.unix21","password");  

  6. if (!$msdb) {  

  7.     echo "connect sqlserver error";  

  8.     exit;  

  9.     }  

  10. mssql_select_db("數據庫名",$msdb);  

  11. $result = mssql_query("SELECT top 5 * FROM tablename"$msdb);  

  12. while($row = mssql_fetch_array($result)) {  

  13.  print_r($row);  

  14. }  

  15. mssql_free_result($result);  

  16. ?>  


(3).PDO版本

[php] view plaincopy

  1. <?php  

  2. header("Content-type: text/html; charset=utf-8");  

  3.   try {  

  4.     $hostname = "數據庫IP";  

  5.     $port = 1433;  

  6.     $dbname = "數據庫名";  

  7.     $username = "blog.csdn.net.unix21";  

  8.     $pw = "password";  

  9.     $dbh = new PDO ("dblib:host=$hostname:$port;dbname=$dbname","$username","$pw");  

  10.   } catch (PDOException $e) {  

  11.     echo "Failed to get DB handle: " . $e->getMessage() . "\n";  

  12.     exit;  

  13.   }  

  14.    

  15.   $stmt = $dbh->prepare("SELECT top 5 * FROM tablename");  

  16.   $stmt->execute();  

  17.   while ($row = $stmt->fetch()) {  

  18.     print_r($row);  

  19.   }  

  20.   unset($dbh); unset($stmt);  

  21.   

  22. ?>  

 

顯示數據:

以上本人都是驗證過的。

相關文章
相關標籤/搜索