现在运行查询后,我的响应时间非常慢,非常简单,例如:
function Bash(){ $sql = “SELECT * FROM Contacts”; $stmt = sqlsrv_query( $conn,$sql ); if( $stmt === false) { die( print_r( sqlsrv_errors(),true) ); }
当我在一个简单的PHP脚本中针对同一个远程数据库运行相同的查询时.我立刻得到了结果.
a)有没有其他人在codeigniter中使用sqlsrv驱动程序遇到此问题?
如果是这样,你是如何解决的?
这是我的连接字符串:
$db['default']['hostname'] = "xxxxx,1433"; $db['default']['username'] = "xx"; $db['default']['password'] = "xxxxxx-xx"; $db['default']['database'] = "xxxxxxxxx"; $db['default']['dbdriver'] = "sqlsrv"; $db['default']['dbprefix'] = ''; $db['default']['pconnect'] = TRUE; $db['default']['db_debug'] = TRUE; $db['default']['cache_on'] = TRUE; $db['default']['cachedir'] = ''; $db['default']['char_set'] = 'utf8'; $db['default']['dbcollat'] = 'utf8_general_ci'; $db['default']['swap_pre'] = ''; $db['default']['autoinit'] = TRUE; $db['default']['stricton'] = FALSE;
更新:
我在运行探查器时发现了以下内容.
加载时间:基本类0.0428
控制器执行时间(欢迎/ AzureBash)58.2173
总执行时间58.2602
似乎查询在0.06秒内执行,但控制器花了一分钟加载.
不知道为什么会这样.
解
因此,下载并覆盖现有界面(覆盖CI中数据库文件夹中的sqlsrv文件夹):
http://www.kaweb.co.uk/blog/mssql-server-2005-and-codeigniter/
注意:这些已经过sql Azure测试并且有效.
$查询 – > NUM_ROWS();不适用于这些驱动程序,所以我建议你使用count代替.或者创建自己的包装器.
此外,date现在是结果集中的日期对象类型.
我希望这有帮助.
解决方案2
如果由于某种原因你发现了一个让它完全无法使用的错误.恢复到最初提供的sqlsrv接口.你会发现导致问题的原因是原始接口执行查询的方式,因此,创建一个数据库助手类;使用$sql = $this-> db-> last_query();获取您要执行的查询,然后在database_helper类中自己执行:
function MakeDbCall ($sql) { $serverName = "xxxxx-xxxx-xxx,1433"; //serverName\instanceName $connectionInfo = array( "Database"=>"xxx","UID"=>"xx","PWD"=>"xxxxx","ConnectionPooling" => "1"); $conn = sqlsrv_connect($serverName,$connectionInfo); $stmt = sqlsrv_query($conn,$sql); while( $row = sqlsrv_fetch_array( $stmt,sqlSRV_FETCH_ASSOC) ) { $result_array[] = $row; } return $result_array; }
为row_array创建一个.
解决方法
http://msdn.microsoft.com/en-us/library/hh487160(v=sql.105).aspx
我老实说不知道PHP的sql server驱动程序是做什么的,但是,考虑到加速等,我可以猜测驱动程序可能默认使用游标.这似乎是个糟糕的主意.我也假设通过选择client_buffered,查询的数据将在没有光标的情况下读取并在客户端的内存中访问,就像它是一个游标一样.如果是这种情况,如果您尝试执行具有许多行要读取的查询,则可能会发生错误.也许另一个选项(sqlSRV_CURSOR_FORWARD?)可用于在没有游标的情况下读取数据 – 但我确信用于访问查询的方法将更加有限(例如,不使用result_array())
-Don