26

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

提前致谢。

4

5 回答 5

35

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 中得到了加速。在这篇博文中,我将首先展示我们已经取得的成果,然后描述我们为获得这些成果所做的工作。

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

于 2008-10-29T18:45:15.840 回答
4

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

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

于 2008-10-29T23:31:26.060 回答
4

mysql_connect()两者mysql_pconnect()都在为数据库连接工作,但差别不大。在mysql_pconnect()中,p代表持久连接。

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

但在mysql_pconnect()功能的情况下:

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

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

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

于 2014-02-10T10:16:04.720 回答
3

您不太可能达到 10000 个连接。无论如何,去官方来源。(强调我的)。

如果持久连接没有任何附加功能,它们有什么用?

这里的答案非常简单——效率。如果创建到 SQL 服务器的链接的开销很高,则持久连接是好的。这种开销是否真的很高取决于许多因素。比如,它是什么类型的数据库,它是否位于您的 Web 服务器所在的同一台计算机上,SQL 服务器所在的计算机的负载情况等等。底线是,如果连接开销很高,持久连接对您有很大帮助. 它们导致子进程在其整个生命周期内仅连接一次,而不是每次处理需要连接到 SQL 服务器的页面时。这意味着每个打开持久连接的子节点都将拥有自己的到服务器的打开持久连接。例如,如果您有 20 个不同的子进程运行一个与您的 SQL 服务器建立持久连接的脚本,那么您将有 20 个与 SQL 服务器的不同连接,每个子进程一个。

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

于 2008-10-29T18:14:48.180 回答
0

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.The database need not be connected every time in mysql_pconncet().

more details:http://prittytimes.com/difference-between-mysql_connect-and-mysql_pconnect/

于 2016-02-25T06:48:35.500 回答