Php sqlsrv在网络上非常慢

Php sqlsrv在网络上非常慢,php,sql-server,networking,sqlsrv,Php,Sql Server,Networking,Sqlsrv,我在php(5.5.12)中使用sqlsrv(php_pdo_sqlsrv_55_ts.dll和php_sqlsrv_55_ts.dll)通过VPN隧道连接到MSSQL 2012服务器。但是大型结果集的传输速度非常慢 为此查询在同一台PC上通过同一VPN隧道测试SSM: SELECT * FROM [Data].[dbo].[Logins] WHERE date >= '2014-01-27 00:00:00.000' AND date < '2014-01-29 00:00:00

我在php(5.5.12)中使用sqlsrv(php_pdo_sqlsrv_55_ts.dll和php_sqlsrv_55_ts.dll)通过VPN隧道连接到MSSQL 2012服务器。但是大型结果集的传输速度非常慢

为此查询在同一台PC上通过同一VPN隧道测试SSM:

SELECT * 
FROM [Data].[dbo].[Logins]
WHERE date >= '2014-01-27 00:00:00.000' AND date < '2014-01-29 00:00:00.000'
选择*
从[Data].[dbo].[Logins]
其中日期>='2014-01-27 00:00:00.000'和日期<'2014-01-29 00:00:00.000'
在4秒内返回大约100000行。在运行查询时,在我的防火墙/VPN上检查传输速率显示2500 KB/s(在100位网络上)

使用PHP:

sqlsrv_configure('ClientBufferMaxKBSize', 1024*1024);
$dbconnect = "SERVER\\HERE";
$dbconinfo = array("UID" => "user", "PWD" => "pass", "Database" => "Data")
$conn = sqlsrv_connect( $dbconnect, $dbconinfo);
$sql = "
SELECT * 
FROM [dbo].[Logins]
WHERE date >= '2014-01-27 00:00:00.000' AND date < '2014-01-29 00:00:00.000'
";

$options = array();
$options["Scrollable"] = SQLSRV_CURSOR_CLIENT_BUFFERED;
$options["QueryTimeout"] = 30000;     

$stmt = sqlsrv_query( $conn, $sql, array(), $options);
sqlsrv\u配置('ClientBufferMaxKBSize',1024*1024);
$dbconnect=“SERVER\\HERE”;
$dbconinfo=array(“UID”=>“user”、“PWD”=>“pass”、“Database”=>“Data”)
$conn=sqlsrv_connect($dbconnect,$dbconinfo);
$sql=”
选择*
来自[dbo]。[登录]
其中日期>='2014-01-27 00:00:00.000'和日期<'2014-01-29 00:00:00.000'
";
$options=array();
$options[“Scrollable”]=SQLSRV\u CURSOR\u CLIENT\u BUFFERED;
$options[“QueryTimeout”]=30000;
$stmt=sqlsrv_查询($conn,$sql,array(),$options);
运行40秒,查询运行时防火墙/VPN显示小于150 KB/s。任务管理器显示脚本大约有5%的CPU

我使用SQLSRV_CURSOR_CLIENT_BUFFERED只是为了测试,因为它在自己的缓冲区中读取结果,而不需要任何进一步的PHP代码。在没有缓冲的情况下获取每组数据只会稍微慢一点(大约45秒)

我还尝试了一个PDO版本,结果也是一样的

连接池0或1也没有任何区别

将服务器名称更改为DNS与IP地址也没有区别

LogSubsystem-1和LogSeverity-1没有显示任何问题或任何有用的东西

我甚至使用Wireshark来观察网络流量,但在PHP和SSMS版本之间找不到任何大的差异。但我对网络层知之甚少


如果您有任何关于可能出现的问题或我可以尝试加快PHP/sqlsrv速度的想法,我们将不胜感激

要将抓取速度提高3倍,请在sqlsrv\u连接选项中使用“MultipleActiveResultSets”=>“0”

例:

换一个怎么样

$options["Scrollable"] = SQLSRV_CURSOR_CLIENT_BUFFERED;

对于慢速sqlsrv操作,最常见的“修复”之一是更改可滚动值。我试过了,但没用……事实上,SQLSRV\u游标\u客户端\u缓冲导致了不稳定的行为

例如:

$stmt = sqlsrv_query( $this->connection,  $sql, array(), array(
                "Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED
));
    sqlsrv_configure('ClientBufferMaxKBSize', 0);           
$serverName = Config::get('settings.MS_DB_HOST').", 1433"; 
$connectionInfo = array( 
    "Database"=>Config::get('settings.MS_DB_NAME'), 
    "UID"=>Config::get('settings.MS_DB_UID'), 
    "PWD"=>Config::get('settings.MS_DB_PWD'),
    "MultipleActiveResultSets"=>'0',
    "connectionpooling"=>"0",
    "TraceOn"=>"0"
);                  
$this->connection = sqlsrv_connect($serverName, $connectionInfo);   
我相信sqlsrv的新版本(我有4.3.0)已经在一定程度上优化了这一点,并且怀疑最新版本不需要它

第二个最流行的建议是更改连接选项…我尝试了许多解决方案…但它们确实没有帮助。同样,我认为更新的sqlsrv驱动程序已经改变了这方面的默认设置

例如:

$stmt = sqlsrv_query( $this->connection,  $sql, array(), array(
                "Scrollable"=>SQLSRV_CURSOR_CLIENT_BUFFERED
));
    sqlsrv_configure('ClientBufferMaxKBSize', 0);           
$serverName = Config::get('settings.MS_DB_HOST').", 1433"; 
$connectionInfo = array( 
    "Database"=>Config::get('settings.MS_DB_NAME'), 
    "UID"=>Config::get('settings.MS_DB_UID'), 
    "PWD"=>Config::get('settings.MS_DB_PWD'),
    "MultipleActiveResultSets"=>'0',
    "connectionpooling"=>"0",
    "TraceOn"=>"0"
);                  
$this->connection = sqlsrv_connect($serverName, $connectionInfo);   
所有这些都说明了…最终帮助我的是认识到sqlsrv_connect是我的罪魁祸首,而且速度非常慢。对于某些应用程序,您不会注意到这一点……但在我的例子中,我处理的代码会在执行后续sql操作之前不断重新连接到数据库。假设这需要半秒的时间来运行…如果您有10个不同的sql语句,每个语句都通过自己的“sqlsrv_connect()”…这(对我来说)可能需要5秒。解决方案是重用第一个实例化中的连接对象。一旦我做到了这一点,性能的提高是巨大的


希望将来sqlsrv库能够编写PHP/MySQL持久连接之类的程序,这样就不需要了。

添加更多的调试。计算代码中每个db调用的时间。如果每个呼叫都同样慢,那么它可能与网络有关。如果它只是一个调用(例如连接),那么它就是该调用的特定对象。我测试了其他查询,得到了相同的结果。看起来我无法让sqlsrv速度超过150KB/s,而SSMS的速度要快10倍。你知道我可以通过网络查什么吗?由于SSMS使用完全相同的连接。我对网络不太了解,但从SQL方面来说,您可以尝试将结果集缩减为仅需要的数据。摆脱
选择*
,只列出所需的字段。这只是一个显示点的测试查询。所有带有大型结果集的PHP/sqlsrv查询都非常慢,比Management Studio中来自同一台PC的完全相同的查询慢10-15倍。我不明白为什么。(如果我使用本地测试SQL server,PHP实际上比SSMS快,但在网络上速度非常慢)非常感谢!这就成功了。它比以前快了大约10倍(将查询时间从40秒提高到3.9秒)。