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("错误",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
答案 0 :(得分: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)是否存在任何问题。确保故障不是由潜在的系统问题引起的。
简而言之,希望使用上述建议可以将您的问题缩小到导致问题的某个数据集或系统的某个部分。
在您完成一些调查后,请回复更详细的信息。
答案 1 :(得分:0)
最后,它是sqlsrv_driver.php的CURSOR问题,在该文件中,找到此SQLSRV_CURSOR_STATIC并将其替换为SQLSRV_CURSOR_CLIENT_BUFFERED。现在它返回结果而不必使用log_message("错误"," abc123"); 甚至执行我的SP的1000次也没问题。
找到解决方案