如何加速mssql_connect()函数

3
我正在处理一个项目,其中PHP对话系统正在与Microsoft SQL Server 2008通信,我需要在PHP端获得更快的速度。
通过分析我的PHP脚本,我发现在这个特定的系统中,调用mssql_connect()需要大约200毫秒。对于一些简单的对话框,这占了整个脚本运行时间的60%左右。因此,如果加速这个调用,我就可以获得巨大的性能提升。
我已经确保每个请求到我的PHP脚本只产生一个单一的连接句柄。
有没有办法加速与SQL Server的初始连接?但是有一些限制:
  • 我不能使用PDO(这里有很多遗留代码不支持它)
  • 我无法访问SQL Server配置,因此需要在PHP端解决问题
  • 由于糟糕的遗留代码,我无法升级到PHP 5.3.X。

1
嗯,你说你不能改变代码,但我仍然建议这样做。不过不是使用PDO而是使用来自微软的SqlSrv驱动程序,这将为您带来向前兼容性到5.3(*mssql扩展在5.3 windows上不再可用)。它实际上也得到了维护,而这并不是mssql扩展的情况。API非常相似,同时表现更好,并且具有处理最新SqlServer版本的更多选项。 - Pierre
3个回答

3

嗯。我对MS SQL了解不多,但优化这个单一调用可能很困难。

有一件事情让我想到了,当然是尝试使用mssql_pconnect():

首先,在连接时,该函数将首先尝试查找已经使用相同主机、用户名和密码打开的(持久)连接。如果找到一个,它将返回其标识符而不是打开一个新连接。

但你可能已经考虑过这个了。

第二件事,你没有说MS SQL是否运行在与PHP部分相同的机器上,但如果不是,也许存在基本的网络问题?一个主机和另一个主机之间的传统ping速度有多快?对于未完美配置的虚拟机也是如此。200毫秒确实听起来非常慢。

然后,在mssql_connect()的用户贡献笔记中,讨论了一个MS SQL的原生PHP驱动程序(talk)。我不知道它的任何信息,无论它是否涉及“旧”语法以及它是否可用于您的情况,但值得一看。

用户贡献笔记总是值得一看的,有像这个一样的小提示:

万一这对大家有帮助...我们正在被IIS6 -> SQL Server 2000极慢的连接折磨。从CGI到ISAPI的切换在某种程度上解决了问题,但最初的连接仍然需要大约10秒钟左右,最终连接将不再起作用。

解决方案是将数据库服务器IP地址添加到服务器的HOST文件中,将其指向内部机器名称。看起来某种类型的DNS查找是罪魁祸首。

现在连接和查询飞快,世界又恢复了正常。


该死,我真的可以想到mssql_pconnect这个函数。至少在我的本地测试机上它运行得非常好,速度也很快。我只是想知道它是否能在生产环境中正常工作,因为那里可能会有数百个用户同时访问数据库... - selfawaresoup
@Tech Yeah,高流量似乎不是持续连接的强项。您肯定需要调整连接限制。在SO上搜索“mssql persistent”,有一些关于该主题的讨论(尽管大多数是针对MySQL)。 - Pekka

3
我们最近一直在 php 5.3、FreeTDS 和 MSSQL 之间进行优化。假设您拥有足够的服务器资源,我们发现两个变化使数据库交互更快速、更可靠。
  1. 使用 mssql_pconnect() 而不是 mssql_connect() 消除了断开连接的问题。我阅读了很多帖子,指出持久连接存在负面问题,但到目前为止,我们没有看到任何暗示表明这是一个问题。根据负载,php 服务器似乎保持着 20 到 60 个持久连接打开到数据库服务器。
  2. 在 freetds.conf 文件中使用数据库服务器的 IP 地址而不是主机名也可以提高速度。

1
我能想到的唯一办法就是使用 IP 地址而不是主机名进行 SQL 连接,以避免 DNS 查找。也许持久连接是一个选项,而且速度会更快一些。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接