当前位置: 首页 > 编程日记 > 正文

Linux环境PHP5.5以上连接SqlServer2008【全网最经典无错版】


linux版本:64位CentOS 6.4

Nginx版本:nginx1.8.0

php版本:php5.5.28

Sqlserver版本:2008

FreeTDS版本:0.95

关于Linux环境安装Nginx+PHP参考Linux环境Nginx安装与调试以及PHP安装 即可。

一般来说,PHP+mysql是最经典的组合,跑在Linux环境是非常好的,如果是PHP+Sqlserver是跑在windows环境下的。

今天需要Linux环境下PHP调用Sqlserver,用了一天的时间,终于把这个问题彻底研究清楚,网上其他类似文章我大都看了,其实有的是因为太久远不适用,有的有错误,还有的有几个关键问题没有说清楚,看此文其他可以忽略了,说真的踩坑真的很累,也没必要,照着这篇来做就是,所以本文才号称是全网最经典无错版,其实这么说主要是希望大家节省时间。

1.首先需要编译安装FreeTDS

说明:一定要从官网下载最新的版本FreeTDS-0.95 ftp://ftp.freetds.org/pub/freetds/stable/freetds-patched.tar.gz

如果官网实在太慢建议从本人上传的这里一样很快下载: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页面指定一样可以。


默认是这样的:

#   $Id: freetds.conf,v 1.12 2007-12-25 06:02:36 jklowden Exp $
#
# This file is installed by FreeTDS if no file by the same 
# name is found in the installation directory.  
#
# For information about the layout of this file and its settings, 
# see the freetds.conf manpage "man freetds.conf".  # Global settings are overridden by those in a database
# server specific section
[global]# TDS protocol version
;	tds version = 4.2# Whether to write a TDSDUMP file for diagnostic purposes# (setting this to /tmp is insecure on a multi-user system)
;	dump file = /tmp/freetds.log
;	debug flags = 0xffff# Command and connection timeouts
;	timeout = 10
;	connect timeout = 10# If you get out-of-memory errors, it may mean that your client# is trying to allocate a huge buffer for a TEXT field.  # Try setting 'text size' to a more reasonable limit text size = 64512# A typical Sybase server
[egServer50]host = symachine.domain.comport = 5000tds version = 5.0# A typical Microsoft server
[egServer70]host = ntmachine.domain.comport = 1433tds version = 7.0

如果你想使用配置项,只要修改[egServer70]即可:

[egServer70]host = 192.168.1.235 这个是数据库服务器IPport = 1433tds 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

增加:

extension = "mssql.so"
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
header("Content-type: text/html; charset=utf-8");
$msdb=mssql_connect("egServer70","blog.csdn.net.unix21","password");
if (!$msdb) {echo "connect sqlserver error";exit;}
mssql_select_db("数据库名",$msdb);
$result = mssql_query("SELECT top 5 * FROM tablename", $msdb);
while($row = mssql_fetch_array($result)) {print_r($row);
}
mssql_free_result($result);
?>

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

(2).mssql_connect非配置版

<?php
header("Content-type: text/html; charset=utf-8");
//$msdb=mssql_connect("数据库IP","blog.csdn.net.unix21","password");
//$msdb=mssql_connect("数据库IP:1433","blog.csdn.net.unix21","password");
$msdb=mssql_connect("数据库IP:49151","blog.csdn.net.unix21","password");
if (!$msdb) {echo "connect sqlserver error";exit;}
mssql_select_db("数据库名",$msdb);
$result = mssql_query("SELECT top 5 * FROM tablename", $msdb);
while($row = mssql_fetch_array($result)) {print_r($row);
}
mssql_free_result($result);
?>


(3).PDO版本

<?php
header("Content-type: text/html; charset=utf-8");try {$hostname = "数据库IP";$port = 1433;$dbname = "数据库名";$username = "blog.csdn.net.unix21";$pw = "password";$dbh = new PDO ("dblib:host=$hostname:$port;dbname=$dbname","$username","$pw");} catch (PDOException $e) {echo "Failed to get DB handle: " . $e->getMessage() . "\n";exit;}$stmt = $dbh->prepare("SELECT top 5 * FROM tablename");$stmt->execute();while ($row = $stmt->fetch()) {print_r($row);}unset($dbh); unset($stmt);?>

显示数据:

以上本人都是验证过的。

参考信息

1.这个帖子解释了第一个重要问题为什么是--with-tdsver=7.1

http://blog.csdn.net/dlutxie/article/details/6851429

2.官方信息

http://php.net/manual/zh/ref.pdo-dblib.php

http://php.net/manual/zh/function.mssql-connect.php

3.本人之前也是参考这些的,但是有些地方有错误,网上主要也就这些帖子,其他都是互相引用的。

http://zyan.cc/php_sqlserver_freetds/

http://my.oschina.net/robanlee/blog/168626?p={{currentPage+1}}

http://blog.csdn.net/rgb_rgb/article/details/8762769

http://blog.sina.com.cn/s/blog_87b9bbc70101avmh.html

http://stackoverflow.com/questions/13180746/mssql-connect-unable-to-connect-to-server-without-freetds-conf

http://blog.csdn.net/chenjiebin/article/details/7278304
http://blog.163.com/koumm@126/blog/static/9540383720112157055119/
http://www.linuxidc.com/Linux/2012-09/70192.htm
http://blog.csdn.net/helonsy/article/details/7207497

http://my.oschina.net/u/217063/blog/220337



相关文章:

python矩阵运算库效率_python - 布尔矩阵运算的最快方法_performance_酷徒编程知识库...

只需在compute中进行一些小的更改&#xff1a;def compute(m, n):m np.asarray(m)n np.asarray(n)# Apply mask N in advancem2 m & n# Pack booleans into uint8 for more efficient bitwise operations# Also transpose for better caching (maybe?)mb np.packbits(…

hibernate-session中的方法

1.操作实体对象的方法 save() 保存 update() 更新 saveOrUpdate() 保存或更新 delete() 删除 2.操作缓存的方法 clear() 清除所有缓存 evit() 将指定对象清除出缓存 flush() 刷新到数据库中&#xff08;&#xff09;马上执行sql语句&#xff0c;不会清除session缓存&#x…

[JZOJ4786]小a的强迫症

[JZOJ4786]小a的强迫症 题目大意&#xff1a; 有\(n(n\le10^5)\)种颜色的珠子&#xff0c;第\(i\)种颜色有\(num[i]\)个。你要把这些珠子排成一排&#xff0c;使得第\(i\)种颜色的最后一个珠子一定在第\(i1\)种珠子的最后一个珠子之前&#xff0c;求方案数。 思路&#xff1a; …

Servlet,过滤器,监听器,拦截器的区别

由于最近两个月工作比较清闲&#xff0c;个人也比较“上进”&#xff0c;利用工作空余时间&#xff0c;也继续学习了一下&#xff0c;某天突然想起struts2和struts1的区别的时 候&#xff0c;发现为什么struts1要用servlet&#xff0c;而struts2要用filter呢&#xff1f;一时又…

Linux环境Nginx安装多版本PHP

关于Linux环境Nginx安装与调试以及PHP安装参考此文即可&#xff1a;http://blog.csdn.net/unix21/article/details/8544922linux版本&#xff1a;64位CentOS 6.4 Nginx版本&#xff1a;nginx1.8.0 php版本&#xff1a;php5.5.28 & php5.4.44 所谓多版本多版本PHP就是php5.4…

java 扫描tcp端口号_多线程TCP端口扫描 java实现

界面部分&#xff1a;import java.awt.Color;import java.awt.Container;import java.awt.FlowLayout;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import javax.swing.JDialog;import javax.swing.JFrame;import javax.swing.JLabel;import javax…

【go同步编程】

锁 互斥锁 函数write中的这条defer语句保证了在该函数被执行结束之前互斥锁mutex一定会被解锁。 var mutex sync.Mutex func write() { mutex.Lock() defer mutex.Unlock() // 省略若干条语句 } func repeatedlyLock() {var mutex sync.Mutexfmt.Println("Lock the lock. …

Linux环境PHP7.0安装

PHP7和HHVM比较PHP7的在真实场景的性能确实已经和HHVM相当, 在一些场景甚至超过了HHVM。HHVM的运维复杂, 是多线程模型, 这就代表着如果一个线程导致crash了, 那么整个服务就挂了, 并且它不会自动重启。另外它采用JIT, 那么意味着, 重启以后要预热, 没有预热的情况下, 性能较为…

myeclipse java可视化_使用MyEclipse可视化开发Hibernate实例

使用MyEclipse可视化开发Hibernate实例2.7节的例子源代码在配套光盘sourcecode/workspace目录的chapter02_first项目中。这个实例主要演示如何使用MyEclipse的可视化开发工具开发Hibernate应用&#xff0c;利用MyEclipse可以提高我们开发Java EE应用的效率。操作的数据库表还是…

day20 文件上传下载

2019独角兽企业重金招聘Python工程师标准>>> 文件上传基础及api解析&#xff1a; 文件上传最终版&#xff1a; 文件下载&#xff1a; 转载于:https://my.oschina.net/u/2356966/blog/648774

腾讯开源基于 mmap 的高性能 key-value 组件 MMKV

腾讯微信团队宣布开源 MMKV &#xff0c;这是基于 mmap 内存映射的 key-value 组件&#xff0c;底层序列化/反序列化使用 protobuf 实现&#xff0c;主打高性能和稳定性。MMKV 从 2015 年中至今&#xff0c;在 iOS 微信上使用已有近 3 年&#xff0c;其性能和稳定性经过了时间的…

Linux环境thinkphp配置以及数据源驱动修改

项目中需要用到thinkphp&#xff0c;以下简称tp。linux版本&#xff1a;64位CentOS 6.4 Nginx版本&#xff1a;nginx1.8.0 php版本&#xff1a;php5.5.28 thinkphp版&#xff1a;3.2.31.安装LNMP Linux环境Nginx安装与调试以及PHP安装2.项目框架 tp源码下载http://www.thinkphp…

《Linux内核设计与实现》读书笔记 第三章 进程管理

第三章进程管理 进程是Unix操作系统抽象概念中最基本的一种。我们拥有操作系统就是为了运行用户程序&#xff0c;因此&#xff0c;进程管理就是所有操作系统的心脏所在。 3.1进程 概念&#xff1a; 进程&#xff1a;处于执行期的程序。但不仅局限于程序&#xff0c;还包含其他资…

java持续集成soapui_集成testNG到JavaAPI测试-执行多条用例

*****************************************************************在这门课里你将学到Web Services(SOAP WebService和REST API)的手动测试及自动化测试&#xff0c;熟练使用Groovy脚本自动化测试WebService。这门课程设计的是从零基础入门开始学&#xff0c;然后以循序渐进…

python-os

os.listdir(path):path-->路径 返回类型为listos.getcwd() 获取当前工作目录os.chdir() 切换工作目录os.mkdir() 新建目录os.path.exists()os.path.isdir() os.path.join() 拼接字符串路径os.path.exists(rpath) 判断路径是否存在 r原始路径os.path.isdir() 判断是否是文件夹…

NetBeans配置Xdebug 远程调试PHP

很多PHP程序员使用echo&#xff0c;dump等比较原始的方法调试&#xff0c;这是非常落后的。几年前本人写过一篇&#xff1a; NetBeans配置Xdebug 由于那篇文档还需要引用本人写的其他文档&#xff0c;感觉有些分散&#xff0c;所以这里重新写一篇完整的。linux版本&#xff1a;…

java自定义上下文对象_Java框架_Spring应用上下文对象加载配置

我们都知道IOC是spring框架的核心&#xff0c;主要作用是控制反转&#xff0c;把我们需要的对象从容器中提供给我们&#xff0c;但是IOC是如何加载我们所需要的对象的&#xff1f;Spring容器是IOC容器的一种&#xff0c;它通过ApplicationContext接口将我们所需要的配置文件进行…

ThreadLocal源码分析

ThreadLocal的作用 Java对象是线程间共享的&#xff0c;但有时我们需要一些线程间隔离的对象&#xff0c;该对象只能由同一个线程读写&#xff0c;对其他线程不可见。ThreadLocal正式提供了这样的机制&#xff0c;详细使用方式请参考Java ThreadLocal。 ThreadLocal实现原理 自…

远程连接windows出现身份验证错误,提示由于CredSSP加密Oracle修正解决方案

本机操作系统(OS版本:10.0.17134) 远程计算机操作系统&#xff08;OS版本:6.3.9600&#xff09; 远程连接的时候报错“出现身份验证错误&#xff0c;要求的函数不受支持。远程计算机:xxx 这可能是由于CredSSP加密Oracle修正,若要了解详细信息...” 原因是系统更新安装了补丁&am…

MediaWiki安装

MediaWiki可以方便的让你搭建自己的wiki&#xff0c;公司内部使用非常方便官网&#xff1a; https://www.mediawiki.org/wiki/MediaWiki安装MediaWiki的必要环境 PHPMysql 下载最新版解压即可 # tar -xzvf mediawiki-1.25.2.tar.gz # mv mediawiki-1.25.2 wiki 输入首页引导一…

sql的四种连接 用mysql的语句写_170221、浅谈mysql的SQL的四种连接

例子&#xff1a;-------------------------------------------------a表 id name b表 id job parent_id1 张3 1 23 12 李四 2 34 23 王武 3 34 4a.id同parent_id 存在关…

MySQL冷备份的跨操作系统还原

数据来源&#xff1a;linux平台mysql版本为5.7 数据去向&#xff1a;windows平台mysql版本为5.7 操作步骤&#xff1a; 第一步&#xff1a;关闭mysql服务 service mysqld stop 第二步&#xff1a;归档linux平台下mysql的数据目录 tar -czvf data.tar.gz /usr/local/mysql/data …

Java 社区领袖联合发文:别慌,Java 仍然是免费的!

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; >>> 在去年的 Java One 上&#xff0c;Mark Cavage 当时宣布 Oracle 将逐步开源 Oracle JDK 的专有功能&#xff08;商业特性&#xff09;。Oracle Java 平台产品管理高级总监 Donald …

Squid安装

最新版Squid安装 http://www.squid-cache.org/Versions/v3/3.5/# wget http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.7.tar.gz# tar zxvf squid-3.5.7.tar.gz# cd squid-3.5.7# ./configure --prefix/usr/local/squid# make && make install# chmod -R 777 /…

Java内部类手机专卖店_JAVA——内部类的那些事儿

obj3.func();//3.2 访问静态内部类的静态方法(通过类名访问)Outer.StaInner.staFunc();//4 局部内部类访问局部变量Outer obj4 new Outer();obj4.local();//5 匿名内部类Outer obj5 new Outer();obj5.anonymous();//6 匿名内部类作为参数asPara(new AbstractClass() {public …

Linux下Postfix的配置和使用

Postfix为何物&#xff0c;详见&#xff1a;http://zh.wikipedia.org/wiki/Postfix 0.关于Postfix postfix的产生是为了替代传统的sendmail.相较于sendmail,postfix在速度。性能和稳定性上都更胜一筹。如今眼下许多的主流邮件服务事实上都在採用postfix. 当我们须要一个轻量级的…

部分人说 Java 的性能已经达到甚至超过 C++,是真的吗?

好多Java程序员都说由于JIT技术的引入&#xff0c;Java的性能已经和C一样了&#xff0c;而且Java的开发效率极高&#xff0c;可以省下60%的时间。请问事实真的是这样吗&#xff1f;我平常也都在写这两个语言&#xff0c;但是因为开发的软件的复杂度不大&#xff0c;并没有感觉到…

Wiki 开源软件

Wiki 是一个协同著作平台或称开放编辑系统。所谓协同工作&#xff0c; 即它能够让浏览网页的人都能够去修订网页&#xff0c;其简介的 ... Wiki 是怎么做到的. Wiki 使用 了简化的语法&#xff0c;替代复杂的HTML&#xff0c;加上WEB 界面的编辑工具&#xff0c;降低内容维护的…

Android studio安装与调试

1.下载安装android studio 下载好之后安装好2.启动报错提示1&#xff09;进入刚安装的Android Studio目录下的bin目录。找到idea.properties文件&#xff0c;用文本编辑器打开。2&#xff09;在idea.properties文件末尾添加一行&#xff1a; disable.android.first.runtrue &am…

java的父类java.lang.object_根父类:java.lang.Object

1、根父类(1)Object类型是所有引用数据类型的超类&#xff0c;包括数组类型如果一个类没有显式的声明它的父类&#xff0c;那么它的父类就是Object。(2)Object类中的方法&#xff0c;会继承到所有类型的对象中&#xff0c;包括数组对象。即所有对象都可以调用Object类中声明的方…