在数据库密集型 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].
如果这是您遇到的错误,那么我可能会提供帮助。第一个答案是查看您的实际查询,看看您是否可以优化它。假设这已经完成,您应该根据您使用的 PHP 版本 打开adodb/adodb-ado5.inc.php或adodb/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