2010-10-14 26 views
1

爲什麼SQL Server PHP驅動程序有長時間運行查詢的問題?運行查詢時PHP SQL Server驅動程序和SQLCMD的區別

每次我有一個查詢,需要一段時間才能跑,我得從sqlsrv_errors以下錯誤()在下面的順序:

共享內存故障,通訊 鏈接失敗,超時失敗

但是,如果我用SQLCMD.exe嘗試相同的查詢,它會恢復正常。 PHP SQL Server驅動程序是否有可以設置無超時的地方?

通過SQLCMD和PHP驅動程序運行查詢有什麼區別?

感謝所有的幫助

的PHP驅動程序運行一個查詢的典型用法。

function already_exists(){ 

    $model_name = trim($_GET['name']); 

    include('../includes/db-connect.php'); 

    $connectionInfo = array('Database' => $monitor_name); 

    $conn = sqlsrv_connect($serverName, $connectionInfo); 

    $tsql = "SELECT model_name FROM slr WHERE model_name = '".$model_name."'"; 

    $queryResult = sqlsrv_query($conn, $tsql); 

    if($queryResult != false){ 

     $rows = sqlsrv_has_rows($queryResult); 

     if ($rows === true){ 

      return true; 

     }else{ 

      return false; 
     } 

    }else{ 

      return false;   
    } 

    sqlsrv_close($conn); 

} 
+0

可能的重複http://stackoverflow.com/questions/67366/a-checklist-for-fixing-net-applications-to-sql-server-timeout-problems-and-impro – 2010-10-14 15:09:41

+0

@ vgv8不是重複的那樣問題與PHP SQL Server Driver無關。 – Abs 2010-10-14 16:35:33

回答

1

SQLCMD沒有默認查詢執行超時。 PHP的確如此。我假設你正在使用mssql_query?如果是這樣,通過此API查詢的默認超時時間爲60秒。您可以通過修改配置屬性mssql.timeout來覆蓋它。

查看更多有關the PHP manual中MSSQL驅動程序的配置信息。

如果你不使用mssql_query,你可以提供更多關於你如何查詢SQL Server的細節嗎?

編輯[基於評論]
是否使用sqlsrv_query呢?尋找at the documentation這應該等待無限期,但你可以覆蓋它。它似乎超時之前等待多久?您可能需要計時並查看它是否一致。如果沒有,你可以提供一個代碼片段(編輯你的問題)來顯示你如何使用驅動程序。

如果MSDTC正在涉及(我不知道如何確定這一點),那麼默認情況下會有60秒的超時。這是在組件服務管理工具中配置的,並且依賴於Windows版本位於不同的位置。

+0

我正在使用PHP SQL Server驅動程序:http://www.microsoft.com/sqlserver/2005/en/us/php-driver.aspx – Abs 2010-10-28 11:46:32

+0

謝謝你的繼續幫助克里斯。我用示例用法更新了我的問題。它等待的時間非常隨機且不一致,我嘗試了幾次。 – Abs 2010-10-29 11:45:56

1

SQL Server 2005的限制最大 數量的TDS數據包65,536每 連接(即在 SQL Server 2008中刪除限制)。作爲默認 SQL Server本機 客戶端(ODBC層)的PacketSize是4K,PHP 驅動程序事實上的傳輸限制 每個連接256MB。當 試圖傳輸多個 65,536個數據包時,在TDS協議級別復位連接爲 。 因此,您應該確保 BULK INSERT不會通過超過256 MB的數據推 ; 否則唯一的選擇是 您的應用程序遷移到SQL Server 2008

從MSDN論壇

http://social.msdn.microsoft.com/Forums/en-US/sqldriverforphp/thread/4a8d822f-83b5-4eac-a38c-6c963b386343

+0

將運行一個查詢,然後等待一個很長時間的結果計數這些數據包被髮送? – Abs 2010-10-29 11:36:45

+0

只有當返回的數據足夠大時,但查看更新後的示例似乎並不那麼重要。 – Coquevas 2010-10-29 14:23:42

+0

感謝您的幫助。我遇到的疑問通常不會返回數據!主要選擇和索引查詢。如果PHP驅動程序查詢連接開放時間作爲我運行的查詢計算出來的數據包,我預計需要大約30分鐘以上纔有意義。 – Abs 2010-10-29 14:46:10

0

PHP本身有幾個不同的超時設置,您可以通過php.ini控制。經常會導致問題的那個是max_execution_time(另請參閱set_time_limit())。如果超出這些限制,php將簡單地終止進程而不考慮正在進行的活動(如正在運行的數據庫查詢)。

還有一個設置,memory_limit,顧名思義。如果超過了內存限制,php只是在沒有警告的情況下殺死進程。

祝你好運。

相關問題