【发布时间】:2013-04-26 16:29:30
【问题描述】:
在数据库密集型 PHP 应用程序中使用 ADOdb 访问 MS SQL Server。一些查询和存储过程运行时间超过 30 秒,ADODB 会因查询超时而引发异常。没有 ADOdb 设置来调整超时。在 SQL Server 中设置更长的命令超时不起作用,因为它显然在 ADOdb 驱动程序中超时。
如何延长命令超时时间?
【问题讨论】:
在数据库密集型 PHP 应用程序中使用 ADOdb 访问 MS SQL Server。一些查询和存储过程运行时间超过 30 秒,ADODB 会因查询超时而引发异常。没有 ADOdb 设置来调整超时。在 SQL Server 中设置更长的命令超时不起作用,因为它显然在 ADOdb 驱动程序中超时。
如何延长命令超时时间?
【问题讨论】:
我之前确实遇到过这个问题。我得到的错误是:
Fatal error: ado_mssql error: [0: [Microsoft][ODBC SQL Server Driver] Query timeout expired].
如果这是您遇到的错误,那么我或许可以提供帮助。 第一个答案是查看您的实际查询,看看您是否可以优化它。假设已经完成,您应该打开 adodb/adodb-ado5.inc.php 或 adodb/adodb-ado.inc.php 取决于您使用的 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
【讨论】: