在 Ubuntu 上从 PHP 连接到 SQL Azure
Posted
技术标签:
【中文标题】在 Ubuntu 上从 PHP 连接到 SQL Azure【英文标题】:Connect to SQL Azure from PHP on Ubuntu 【发布时间】:2014-01-12 23:01:02 【问题描述】:我正在尝试通过在 Ubuntu 11.04 服务器上运行的 php 连接到 SQL Azure 数据库。
服务器运行 PHP 版本 => 5.3.5-1ubuntu7.11。
我已经多次使用 apt-get install 安装了 freetds-bin、freetds-common、tdsodbc、odbcinst、php5-odbc 和 unixodbc。我尝试编译带有 SSL 支持的 FreeTDS,但不确定是否成功。
此时,我在尝试使用 isql 工具进行连接时收到错误“08S01 - 通信链路故障”。 Microsoft 文章将该错误解释为“在 SQLDriverConnect 函数完成处理之前,驱动程序与驱动程序尝试连接的数据源之间的通信链接失败。”对此的一些研究特别指出 FreeTDS 中缺乏 SSL 支持,但我不清楚如何验证它是否已启用。
我将使用 PHP 数据对象或 mssql_* 函数连接到 SQL Azure 数据库。我对PDO不太熟悉,但是好像PDO不一定要用ODBC?我对此不太清楚,我怀疑它会导致我对 isql 看到的问题进行故障排除,这些问题与我在 PHP 中看到的问题无关。 isql 工具的连接问题是否与 PHP 中的 PDO 或 mssql_* 函数中的连接问题有关?
我最近使用 PDO 的尝试是:
<?php
$c = new PDO("odbc:Driver=FreeTDS;Port=1433;Server=sssssssssss.database.windows.net;Database=db_xxxxx_xxx_xxx;UID=db_xxxxx_xxx_xxx_ExternalWriter;PWD=ppppppppp");
?>
此代码在我的 Apache 日志文件中生成以下错误:
[2013 年 12 月 24 日星期二 13:23:10] [错误] [客户端 10.1.1.11] PHP 致命错误: 带有消息“SQLSTATE [08S01]”的未捕获异常“PDOException” SQLDriverConnect: 20004 [unixODBC][FreeTDS][SQL Server]从 /var/www/test/pdo.php:3\n堆栈跟踪:\n#0 中的服务器失败 /var/www/test/pdo.php(3): PDO->__construct('odbc:Driver=Fre...')\n#1 main\n 在第 3 行的 /var/www/test/pdo.php 中抛出
我的 /etc/freetds/freetds.conf:
[global]
# TDS protocol version
tds version = 9.1
# 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 Microsoft server
[FreeTDS]
host = ssssssssss.database.windows.net
port = 1433
tds version = 9.1
client charset = UTF-8
/etc/odbc.ini:
[TS]
Description = "test"
Driver = FreeTDS
Server = sssssssssssss.database.windows.net
Port = 1433
Database = db_xxxxxxx_xxx_xxx
/etc/odbcinst.ini
[FreeTDS]
Description = tdsodbc
Driver = /usr/lib/odbc/libtdsodbc.so
对于这个混乱的任何帮助将不胜感激。我显然在这一点上迷路了。谢谢!
【问题讨论】:
我已经按照 freetds.org/userguide/config.htm 的 FreeTDS 文档配置 FreeTDS 和 freetds.org/userguide/install.htm 安装它。 tsql -H sss.database.windows.net -p 1433 -U user -P pwd 现在返回“无法打开登录请求的服务器 'sss'。不允许 IP 地址为 'nnnn' 的客户端访问服务器。启用访问、使用 Windows Azure 管理门户或运行....”显然错误来自 Azure,并且至少正在进行连接。 SQL Azure 防火墙配置为允许来自任何计算机的连接。 【参考方案1】:我没有专门在 Azure 上尝试过,但是在我们这里的本地 SQL Server 机器上,我发现带有 PDO 的 php5-sybase 模块比 freetds 更容易使用:
apt-get install php5-sybase
<?php
$dsn = 'dblib:dbname=TestDB;host=sqlserver;charset=UTF-8';
$dbh = new PDO($dsn, 'username', 'password');
此外,在解决问题时,我发现查看数据库流量的 Wireshark 跟踪很有启发性,因为 SQL 服务器发出的消息通常非常有用,但在 PDO 错误中却没有。
【讨论】:
以上是关于在 Ubuntu 上从 PHP 连接到 SQL Azure的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Ubuntu 18.04 使用 PHP 连接到 MSSQL Server?
是否可以使用 PHP7 连接到 SQL Server 2000?
无法在 Windows 上从 Python 连接到 MSSQL Server