【问题标题】:Difference between PHP SQL Server Driver and SQLCMD when running queries运行查询时 PHP SQL Server Driver 和 SQLCMD 的区别
【发布时间】:2010-10-14 14:21:35
【问题描述】:

为什么 SQL Server PHP 驱动程序存在长时间运行查询的问题?

每次我有一个需要一段时间才能运行的查询时,我都会按以下顺序从 sqlsrv_errors() 收到以下错误:

共享内存故障,通信 链接失败,超时失败

但是,如果我尝试使用 SQLCMD.exe 进行相同的查询,它会返回正常。 PHP SQL Server 驱动程序是否有可以设置无超时的地方?

通过 SQLCMD 和 PHP Driver 运行查询有什么区别?

感谢大家的帮助

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);

}

【问题讨论】:

标签: php sql-server


【解决方案1】:

SQLCMD 默认没有查询执行超时。 PHP 可以。我假设您使用的是mssql_query?如果是这样,则通过此 API 进行查询的默认超时为 60 秒。您可以通过修改配置属性mssql.timeout来覆盖它。

更多MSSQL驱动配置见the PHP manual

如果您没有使用 mssql_query,您能否详细说明您是如何查询 SQL Server 的?

编辑[根据评论]
那你用sqlsrv_query吗?看着at the documentation 这应该无限期地等待,但是您可以覆盖它。在它似乎超时之前等待多长时间?你可能想计时,看看它是否一致。如果没有,您能否提供代码 sn-p(编辑您的问题)以显示您如何使用驱动程序。

如果 MSDTC 参与其中(我不知道您如何确定这一点),那么默认情况下会有 60 秒的超时。这是在组件服务管理工具中配置的,并且根据 Windows 版本位于不同的位置。

【讨论】:

  • 我正在使用 PHP SQL Server 驱动程序:microsoft.com/sqlserver/2005/en/us/php-driver.aspx
  • 感谢您对克里斯的持续帮助。我已经用示例用法更新了我的问题。它等待的时间非常随机且不一致,我尝试了几次。
【解决方案2】:

SQL Server 2005 限制最大值 TDS 数据包数量为 65,536 个 连接(在 SQL Server 2008)。作为默认 SQL Server Native 的 PacketSize 客户端(ODBC 层)是 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

【讨论】:

  • 运行查询然后长时间等待结果是否计入发送的这些数据包?
  • 只有返回的数据够大,但是看你更新的例子好像没那么多。
  • 感谢您迄今为止的帮助。我遇到问题的查询通常不会返回数据(如果有的话)!主要是选择和索引查询。如果 PHP 驱动程序查询连接打开时间计入这些数据包作为我运行的查询,那将是有道理的,我预计大约需要 30 多分钟。
  • 如果它是一个维护低配置脚本,您可以在每次查询执行之前尝试重新连接以防止这种超时。
【解决方案3】:

PHP 本身有几个不同的超时设置,您可以通过php.ini 控制它们。经常引起您所看到的问题的是max_execution_time(另请参阅set_time_limit())。如果超出这些限制,php 将简单地终止进程,而不考虑正在进行的活动(如正在运行的数据库查询)。

还有一个设置,memory_limit,顾名思义。如果超出内存限制,php 会直接终止进程而不会发出警告。

祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    相关资源
    最近更新 更多