使用ADOdb访问数据库密集型PHP应用程序中的MS SQL Server。一些查询和存储过程运行时间超过30秒,ADODB会因查询超时而抛出异常。没有ADOdb设置来调整超时。在SQL Server中设置更长的命令超时不起作用,因为它显然在ADOdb驱动程序中超时。
如何延长命令超时?
答案 0 :(得分:1)
我之前遇到过这个问题。我得到的错误是:
Fatal error: ado_mssql error: [0: [Microsoft][ODBC SQL Server Driver] Query timeout expired].
如果这是你得到的错误,那么我可以提供帮助。 第一个答案是查看您的实际查询,看看您是否可以优化它。假设已经完成,您应该打开 adodb / adodb-ado5.inc.php 或 adodb / adodb-ado.inc.php < / em> 取决于您使用的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-&gt; CommandTimeout = 120;
您可以根据需要调整超时,但也要注意其他php.ini设置或可能受更长时间影响的其他服务。
希望这会有所帮助,如果你好奇的话,我前面还写了一篇关于这个问题的更深入的写作:http://pointent.com/adodb_query_timeout_expired_fix.html