mysql_connect VS mysql_pconnect [关闭]

Posted

技术标签:

【中文标题】mysql_connect VS mysql_pconnect [关闭]【英文标题】:mysql_connect VS mysql_pconnect [closed] 【发布时间】:2010-09-19 20:30:24 【问题描述】:

我有这个疑问,我在网上搜索过,答案似乎多种多样。通过 php 连接到数据库时,使用 mysql_pconnect 而不是 mysql_connect 更好吗?我读到 pconnect 的扩展性要好得多,但另一方面,作为一个持久连接......同时拥有 10 000 个连接,所有连接都是持久的,对我来说似乎无法扩展。

提前致谢。

【问题讨论】:

【参考方案1】:

MySQL 不需要持久连接。在其他数据库(例如 Oracle)中,建立连接既昂贵又耗时,因此如果您可以重用连接,那将是一个巨大的胜利。但是这些品牌的数据库提供了连接池,可以更好地解决问题。

与其他品牌的数据库相比,与 MySQL 数据库建立连接速度更快,因此使用持久连接为 MySQL 带来的好处比其他品牌的数据库要少。

持久连接也有缺点。数据库服务器为每个连接分配资源,无论这些连接是否需要。因此,如果连接处于空闲状态,您会看到大量无用的资源浪费。我不知道你是否会达到 10,000 个空闲连接,但即使是几百个也很昂贵。

连接具有状态,PHP 请求从先前由另一个 PHP 请求使用的会话中“继承”信息是不合适的。例如,临时表和用户变量通常会在连接关闭时被清除,但如果您使用持久连接则不会。同样基于会话的设置,如字符集和排序规则。此外,LAST_INSERT_ID() 会报告会话期间最后生成的 id ——即使那是在之前的 PHP 请求期间。

至少对于 MySQL,持久连接的缺点可能超过了它们的好处。还有其他更好的技术可以实现高可扩展性。


2014 年 3 月更新:

与其他品牌的 RDBMS 相比,MySQL 的连接速度一直较低,但正在变得更好。

见http://mysqlserverteam.com/improving-connectdisconnect-performance/

在 MySQL 5.6 中,我们开始着手优化代码处理连接和断开连接。而这项工作在 MySQL 5.7 中得到了加速。在这篇博文中,我将首先展示我们已经取得的成果,然后描述我们为取得这些成果所做的工作。

阅读博客了解更多详细信息和速度比较。

【讨论】:

【参考方案2】:

基本上,您必须平衡创建连接与保持连接的成本。尽管 MySQL 建立新连接的速度非常快,但它仍然需要花费 - 线程设置时间,以及来自 Web 服务器的 TCP/IP 设置时间。这在足够高的流量站点上很明显。不幸的是,PHP 对连接的持久性没有任何控制。所以答案是大大降低 MySQL 中的空闲超时时间(比如降低到 20 秒),并增加线程缓存大小。总之,这通常非常有效。

另一方面,您的应用程序需要尊重连接的状态。最好不要假设会话处于什么状态。如果您使用临时表,那么使用 CREATE IF NOT EXISTS 和 TRUNCATE TABLE 会有很大帮助,唯一地命名它们(例如包含用户 ID)也有很大帮助。交易更成问题;但是您的代码总是可以在顶部执行 ROLLBACK,以防万一。

【讨论】:

在比我写此回复时更新的 PHP 版本中,我发现现在有调整池大小的设置。特别是,5.4.0 具有选项mysqli.max_persistent,这是该 PHP 实例中连接池的最大大小。 PHP 中仍然没有超时连接的值。【参考方案3】:

mysql_connect()mysql_pconnect() 都用于数据库连接,但差别不大。在mysql_pconnect() 中,p 代表持久连接。

当我们使用mysql_connect()函数时,它每次打开和关闭数据库连接,取决于请求。

但在mysql_pconnect()函数的情况下:

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

其次,脚本执行结束时不会关闭与SQL server的连接。相反,连接将保持打开状态以供将来使用(mysql_close() 不会关闭由mysql_pconnect() 建立的连接)。

mysql_pconncet() 在您的网站上有大量流量时很有用。那时,对于每个请求,它都不会打开连接,而是从池中取出连接。这将提高您网站的效率。但一般使用 mysql_connect() 是最好的。

【讨论】:

mysql_pconnect() 与 mysqlnd 一起使用会更好吗? “,该函数将尝试查找已使用相同主机、用户名和密码打开的(持久)连接。” - 我认为这对 mysqlnd 更有效还是我错了?【参考方案4】:

达到 10000 个连接的可能性很小。总之,去official source。 (强调我的)。

如果没有持久连接 任何添加的功能,什么是 他们适合吗?

这里的答案非常简单—— 效率。持久连接是 如果创建链接的开销很好 对你的 SQL 服务器来说很高。是否 不是这个开销真的很高 取决于许多因素。像什么 它是一种数据库,无论是 不是它位于同一台计算机上 您的网络服务器位于哪个位置,如何使用 加载 SQL 服务器所在的机器 on is 等等。 底线 是如果那个连接开销是 高、持久的连接可以帮助您 相当。他们导致孩子 只连接一次的过程 在其整个生命周期内,而不是 每次它处理一个页面时 需要连接到 SQL 服务器。 这意味着对于每个孩子 打开一个持久连接将 有自己的开放执着 连接到服务器。例如, 如果你有 20 个不同的孩子 运行脚本的进程 与您的 SQL 的持久连接 服务器,你会有 20 个不同的 与 SQL 服务器的连接,一个 来自每个孩子。

但是请注意,这可能有一些 使用数据库时的缺点 连接限制为 被顽固的孩子超过 连接。如果您的数据库有 限制 16 个同时连接, 在繁忙的服务器过程中 会话,17 个子线程尝试 连接,一个将无法连接。如果 您的脚本中有错误 不允许连接关闭 向下(例如无限循环),则 只有 16 个连接的数据库可能 被迅速淹没。检查你的 数据库文档以获取信息 关于处理废弃或闲置 连接。

【讨论】:

【参考方案5】:

MYSQL_CONNECT()

1.mysql_connect可以用来关闭连接。每次打开和关闭数据库连接,根据请求而定。

2.在MYSQL connect中每次加载页面时都会打开这里的数据库

3.页面加载时,每次都加载数据库

4.用于关闭连接

例子:

<?php $conn = mysql_connect(‘host’, ‘mysql_user’, ‘mysql_password’); if(!$conn) die(‘Could not connect: ‘ . mysql_error());  echo ‘Connected successfully’; mysql_close($conn); ?>

说明:

host:指定主机名或 IP 地址,如 localhost。

mysql_user:指定 MySQL 用户名

mysql_password:指定 MySQL 密码

MYSQL_PCONNECT()

1.我们使用mysql_pconncet(),它最初试图找到一个打开的持久连接。

2.mysql_pconncet()打开持久连接

3.mysql_pconnect()不支持关闭连接

4.mysql_pconnect() 无法关闭连接。这里打开一个到数据库的持久连接

5.这里的数据库不需要每次都连接。

6.mysql_pconncet()不需要每次都连接数据库。

更多详情:http://prittytimes.com/difference-between-mysql_connect-and-mysql_pconnect/

【讨论】:

以上是关于mysql_connect VS mysql_pconnect [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

mysql_connect() 总是拒绝访问

php中@mysql_connect与mysql_connect有什么区别

php中@mysql_connect与mysql_connect有什么区别

警告:mysql_connect():读取问候包时出错

mysql_connect():标头和客户端库次要版本不匹配库:100005

防止 mysql_connect() 上的错误 - 访问被拒绝