0

在数据库密集型 PHP 应用程序中使用 ADOdb 访问 MS SQL Server。一些查询和存储过程运行时间超过 30 秒,ADODB 会因查询超时而引发异常。没有 ADOdb 设置来调整超时。在 SQL Server 中设置更长的命令超时不起作用,因为它显然在 ADOdb 驱动程序中超时。

如何延长命令超时?

4

1 回答 1

1

我之前确实遇到过这个问题。我得到的错误是:

Fatal error: ado_mssql error: [0: [Microsoft][ODBC SQL Server Driver] Query timeout expired].

如果这是您遇到的错误,那么我可能会提供帮助。第一个答案是查看您的实际查询,看看您是否可以优化它。假设这已经完成,您应该根据您使用的 PHP 版本 打开adodb/adodb-ado5.inc.phpadodb/adodb-ado.inc.php 。

在该文件中,查找function _connect. 你会想要改变它:

function _connect($argHostname, $argUsername, $argPassword,$argDBorProvider, $argProvider= ''){
    ...
    ...
    if ($argDatabasename) $argHostname .= ";DATABASE=$argDatabasename"; 
    if ($argUsername) $argHostname .= ";$u=$argUsername";
    if ($argPassword)$argHostname .= ";$p=$argPassword";
    if ($this->debug) ADOConnection::outp( "Host=".$argHostname." \n version=$dbc->version");
    @$dbc->Open((string) $argHostname);
    $this->_connectionID = $dbc;

    $dbc->CursorLocation = $this->_cursor_location;
    return  $dbc->State > 0;
    } catch (exception $e) {
    }

    return false;
}

对此:

function _connect($argHostname, $argUsername, $argPassword,$argDBorProvider, $argProvider= ''){
    ...
    ...
    if ($argDatabasename) $argHostname .= ";DATABASE=$argDatabasename"; 
    if ($argUsername) $argHostname .= ";$u=$argUsername";
    if ($argPassword)$argHostname .= ";$p=$argPassword";
    if ($this->debug) ADOConnection::outp( "Host=".$argHostname."
\n version=$dbc->version");
    @$dbc->Open((string) $argHostname);

    $dbc->CommandTimeout = 120;

    $this->_connectionID = $dbc;

    $dbc->CursorLocation = $this->_cursor_location;
    return  $dbc->State > 0;
    } catch (exception $e) {
    }

    return false;
}

关键部分是

$dbc->CommandTimeout = 120;

您可以根据需要调整超时,但也要注意其他 php.ini 设置或其他可能会受到较长超时影响的服务。

希望这会有所帮助,如果您好奇的话,我不久前还写了一篇更深入的文章:http: //pointent.com/adodb_query_timeout_expired_fix.html

于 2013-04-26T17:34:00.890 回答