【问题标题】:php against sql server 2005 is timing out针对 sql server 2005 的 php 超时
【发布时间】:2010-12-10 17:37:23
【问题描述】:

我正在使用 PHP 的 MS 驱动程序从命令行针对 SQL Server 2005 运行一个 php 脚本并获得超时。从 SQL Server Management Studio 查询大约需要 2 分钟,并返回 > 300,000 行。

脚本中有多个查询,我对每个查询执行sqlsrv_connect(),执行查询,然后执行sqlsrv_free_stmt()sqlsrv_close()

来自sqlsrv_errors():的输出

Array
(
    [0] => Array
        (
            [0] => 08S01
            [SQLSTATE] => 08S01
            [1] => 258
            [code] => 258
            [2] => [Microsoft][SQL Native Client]Shared Memory Provider: Timeout error [258]. 
            [message] => [Microsoft][SQL Native Client]Shared Memory Provider: Timeout error [258]. 
        )
    [1] => Array
        (
            [0] => 08S01
            [SQLSTATE] => 08S01
            [1] => 258
            [code] => 258
            [2] => [Microsoft][SQL Native Client]Communication link failure
            [message] => [Microsoft][SQL Native Client]Communication link failure
        )
    [2] => Array
        (
            [0] => 08S01
            [SQLSTATE] => 08S01
            [1] => 0
            [code] => 0
            [2] => [Microsoft][SQL Native Client]Communication link failure
            [message] => [Microsoft][SQL Native Client]Communication link failure
        )
) 

【问题讨论】:

    标签: php sql-server sql-server-2005 timeout


    【解决方案1】:

    我从来没有让 SQL Server 2005 和 PHP 使用 Microsoft 驱动程序进行通信,但它与 PDO's ODBC driver 工作得很好。可能值得一试。

    简单的连接:

    $host     = '1.2.3.4';
    $port     = '1433';
    $database = 'MyDatabase';
    $user     = 'MyDatabaseUser';
    $password = 'MyDatabasePassword';
    
    $dsn = "odbc:DRIVER={SQL Server};SERVER=$server,$port;DATABASE=$database";
    
    try {
      // connect
      $conn = new PDO($dsn,$user,$password);
    } catch (PDOException $e) {
      // fancy error handling
    }
    

    【讨论】:

    • 我已经迁移到用于 SQL Server、Oracle 和 ODBC(用于 Teradata 连接)的 PDO。我只有 2 个问题是:用于 PHP 的 MS SQL Server 驱动程序用于返回受查询影响的行(我通过在表加载之前和之后执行计数(*)来解决这个问题) PDO ODBC 连接到 Teradata 有一个错误,即 varchar fields > 400 字节返回一个空字符串,并且查询中之后的所有字段也被空白。我认为这是一个显然已修复的旧错误,但我升级到 PHP 5.3.1 并仍然遇到它。解决方法是将所有较长的 varchar 字段转换为较短的长度。
    【解决方案2】:

    我能想到的几件事。

    您是否已在数据库服务器上设置 MS SQL 以允许远程连接?如果没有,您将需要这样做。

    其次,您使用的是命名管道还是 TCP/IP?

    【讨论】:

    • 远程连接已启用,我们正在使用 TCP/IP
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2010-09-06
    • 2012-06-14
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 2012-10-16
    相关资源
    最近更新 更多