今天碰到一客户要求在Linux服务器上使用ThinkPHP连接另一台SQLServer(SQLServer 2012)服务器,网上教程很多,在此说明下遇到的问题及解决。
连接方式为使用FreeTds,可以去官网下载最新版,下载速度非常慢,以下提供网盘已经下载了的(版本:1.00.82):
链接:https://pan.baidu.com/s/1nwXvBFN 密码:a9c4
安装完FreeTds和mssql后,安装PDO扩展,进入PHP源码(版本:PHP5.6.33)ext/pdo文件夹,执行:
./configure --with-php-config=/usr/bin/php-config5.6 --enable-pdo=shared
然后是make&&make install
完成后进入 pdo_dblib执行同样的命令,完成后进入php.ini开启相应的扩展。
以下是遇到的问题:
1.安装pdo_dblib扩展时,提示Cannot find FreeTDS in known installation directories问题
解决办法是:在configure(第3921行)文件和config.m4(第16行)中找到如下部分:
for i in /usr/local /usr; do
if test -f $i/include/sybdb.h; then
PDO_FREETDS_INSTALLATION_DIR=$i
PDO_FREETDS_INCLUDE_DIR=$i/include
break
elif test -f $i/include/freetds/sybdb.h; then
PDO_FREETDS_INSTALLATION_DIR=$i
PDO_FREETDS_INCLUDE_DIR=$i/include/freetds
break;
fi
done
将红色部分修改为你正确的freetds安装路径,如我修改为: for i in /usr/local /usr/local/freetds; do........
2.安装时遇到Cannot find php_pdo_driver.h
此原因是未安装 pdo扩展的问题,转到PDO模块配置,安装完成即可。
3.Thinkphp中连接的修改:
修改位于ThinkPHP/Library/Db/Driver/Sqlsrv.class.php中对应的内容,修改为以下部分(红色部分注释删除,黄色部分修改):
// PDO连接参数
protected $options = array(
PDO::ATTR_CASE => PDO::CASE_LOWER,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_STRINGIFY_FETCHES => false,
//PDO::SQLSRV_ATTR_ENCODING => PDO::SQLSRV_ENCODING_UTF8,
);
/**
* 解析pdo连接的dsn信息
* @access public
* @param array $config 连接信息
* @return string
*/
protected function parseDsn($config){
// $dsn = 'sqlsrv:Database='.$config['database'].';Server='.$config['hostname'];
$dsn = 'dblib:host='.$config['hostname'].';dbname='.$config['database'];
/* if(!empty($config['hostport'])) {
$dsn .= ','.$config['hostport'];
}*/
return $dsn;
}
修改完成后,原有项目即可运行。