企業常面臨跨平台整合需求:既有 SQL Server 資料庫運行於 Windows,但 Web 應用部署於 Linux/PHP 架構。本文詳細記錄基於 FreeTDS 實現 Linux PHP 連接 SQL Server 的完整編譯安裝與配置流程,解決 ODBC 驅動缺失的核心難題。
PHP → FreeTDS (TDS 協議實作) → SQL Server (TDS 7.0/8.0 協議)
FreeTDS 是開源的 Tabular Data Stream (TDS) 協議庫,使 Linux/Unix 能原生使用 TDS 協議與 SQL Server、Sybase 通訊。
freetds-0.53.tgz (來源: ftp://ftp.ibiblio.org/pub/Linux/ALPHA/freetds/)cd /tmp
tar zxvf freetds-0.53.tgz
cd freetds-0.53
./configure --prefix=/usr/local/freetds --with-tdsver=7.0
make
make install
關鍵參數:--with-tdsver=7.0 強制使用 TDS 7.0 協議(對應 SQL Server 7.0/2000,預設埠 1433)。若省略將預設編譯為 TDS 5.0(埠 4000),導致連線失敗。
cd php-source-directory
./configure --with-apxs --with-mysql ... --with-sybase=/usr/local/freetds
make
make install
注意:--with-sybase 指向 FreeTDS 安裝路徑,而非 --with-mssql(舊版 PHP 以 Sybase 模組支援 FreeTDS)。
編輯 /usr/local/freetds/etc/freetds.conf:
[sqlserver]
host = 192.168.1.100 # SQL Server IP 或主機名
port = 1433
tds version = 7.0
支援 Windows 域帳號或 SQL Server 混合模式認證,詳見配置檔說明。
編輯 php.ini,取消註解:
extension=mssql70.so
<?php
$link = mssql_connect("sqlserver", "username", "password")
or die("無法連線資料庫: " . mssql_get_last_message());
echo "連線成功,Link ID: $link";
?>
此處 "sqlserver" 對應 freetds.conf 中的區塊名 [sqlserver]。
編輯 freetds.conf,取消註解:
dump file = /tmp/freetds.log
重新執行測試腳本,分析 /tmp/freetds.log 定位協議握手、認證、字碼頁轉換等階段的錯誤細節。
NVARCHAR,PHP 端用 iconv() 或 mb_convert_encoding() 明確轉碼。sqlsrv 或 PDO_SQLSRV 驅動(需安裝 ODBC Driver for Linux),效能與穩定性優於 FreeTDS 方案。