在 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

在 Linux 上从 .NET Core 连接到 Informix

在 Mac 上从 R 连接到 Oracle

在 Linux 上从 Python 连接到受保护的 WiFi