【问题标题】:PHP sqlsrv store procedure sometimes no return resultPHP sqlsrv 存储过程有时无返回结果
【发布时间】:2014-04-25 08:53:44
【问题描述】:

我在 PHP Sqlsrv 调用存储过程时遇到了这个奇怪的问题。有时它返回结果,有时不返回。用netbean php调试时,弹出Socket异常。当浏览器发出请求时,连接被重置并且不返回任何错误。

我正在使用codeigniter的sqlsrv库

function result_object()
    {
        if (count($this->result_object) > 0)
        {
            return $this->result_object;
        }

        // In the event that query caching is on the result_id variable
        // will return FALSE since there isn't a valid SQL resource so
        // we'll simply return an empty array.
        if ($this->result_id === FALSE OR $this->num_rows() == 0)
        {
            return array();
        }

        $this->_data_seek(0);
        while ($row = $this->_fetch_object())
        {
            $this->result_object[] = $row;
        }

        return $this->result_object;
    }

function result($type = 'object')
    {
        if ($type == 'array') return $this->result_array();
        else if ($type == 'object') return $this->result_object();
        else return $this->custom_result_object($type);
    }

$result = null;
        do{
            $result = $this->result(); //error happen on this line.
              log_message("error", print_r($result,true)); // if added this line, the result is okay most of the time
            }while( sqlsrv_next_result($this->result_id));

编辑: 好的,这越来越奇怪了,如果我在 $result 之后添加这一行,那么它在大部分时间都有效。 log_message("错误", print_r($result,true));

编辑 2: 好的,只是与将消息记录到文件中有关。像这样也可以。似乎与输出缓冲有关? log_message("error", print_r("abc123",true));

编辑 3:

'hostname'  => '192.168.8.165',
'username'  => 'xxx',
'password'  => 'xxx',
'database'  => 'dbname',
'dbdriver'  => 'sqlsrv',
'dbprefix'  => '',
'pconnect'  => FALSE,
'db_debug'  => TRUE,
'cache_on'  => FALSE,
'cachedir'  => '',
'char_set'  => 'utf8',
'dbcollat'  => 'utf8_unicode_ci',
'swap_pre'  => '',
'autoinit'  => TRUE,
'stricton'  => FALSE

【问题讨论】:

  • 在您的 config->database.php 中,您的数据库配置是否有 $db['default']['cache_on'] = FALSE; ?编辑:也试试这个 - $db['default']['pconnect'] = FALSE;
  • 是的,它已经是假的了。 'cache_on' => 假,
  • 那个 pconnect 也已经存在了。我刚刚在问题中添加了我的配置。

标签: php sql-server codeigniter


【解决方案1】:

我真的不太熟悉用于 PHP 连接到 SQL Server 的 codeigniter 库。这是来自开发人员的一篇文章,它能够让它工作。

http://www.manjustudio.com/2013/01/09/codeigniter-mssql-sqlsrv/comment-page-1/

但是,连接到 SQL server 数据库时,在最低级别使用表格数据流格式。

无论网络接口协议或更高级别的库(如 ODBC 或 ADO)如何,所有流量都以 TDS 格式进入服务器。

调试此问题的一种方法。

1 - 编写 TSQL 测试代码以多次调用您的存储过程 (10K)。可以直接在 SSMS 查询窗口中进行此调用。你有什么意外的失败吗?

如果是这样,那就是 TSQL 编码问题。

2 - 编写 PHP 测试代码以多次调用您的存储过程(10K)。你有什么意外的失败吗?

如果是这样,那就是 PHP 编码问题。

在尝试以上两个问题的时候,如果没有出现错误,那就更难找了。

这里有一些事情要检查。

A - 从 web 服务器到 sql server 的网络连接有多可靠?

B - codeigniter 库是否有任何已知问题?搜索论坛。

C - 我确实注意到可能需要安装本机客户端才能使用该库。客户端库和服务器库是同一版本级别吗?

D - SQL Server 数据库是否在当前服务版本上?如果没有,请更新到当前的 SP 或 CU。

E - 创建服务器端跟踪以捕获此调用的所有流量。看看你能不能准确地捕捉到让骆驼退缩的叫声。

F - 检查日志(SQL、IIS 或 APACHE、WINDOWS 或 UNIX)是否有任何问题。确保失败不是由于潜在的系统问题。

简而言之,希望使用上述建议可以将您的问题缩小到导致问题的某个数据集或系统的某个部分。

请在您完成一些调查后写回更详细的信息。

  • 狡猾的 DBA 约翰

【讨论】:

  • 感谢您提供全面而优质的回答。 sp执行1000次,SSMS没问题,PHP有问题。不过我已经得到答案了,我会单独贴出来。
  • 虽然这并没有给出直接的解决方案,但它是最好的答案,我可以在答案中看到你的努力。所以奖励给你 50 赏金:)
  • William - 很高兴您在另一篇文章中发现了该错误。调试系统可能会让人头疼,但从底层开始,向上工作通常会找到根本原因 (RC)。
【解决方案2】:

最后,是 sqlsrv_driver.php 的 CURSOR 问题,在该文件中,找到此 SQLSRV_CURSOR_STATIC 并将其替换为 SQLSRV_CURSOR_CLIENT_BUFFERED 。现在它返回结果而不必使用 log_message("error", "abc123"); 甚至我的SP执行1000次都没问题。

https://stackoverflow.com/a/16796421/660810找到解决方案

【讨论】:

    猜你喜欢
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2015-06-03
    • 2013-06-21
    • 2014-02-06
    • 1970-01-01
    相关资源
    最近更新 更多