2013-04-26 102 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