2013-04-26 77 views
0

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

如何扩展命令超时?

回答

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