我有这个疑问,上网查了一下,答案似乎五花八门。通过 PHP 连接数据库时,使用 mysql_pconnect 比使用 mysql_connect 更好吗?我读到 pconnect 的扩展性更好,但另一方面,作为持久连接......同时拥有 10 000 个连接,并且都是持久的,对我来说似乎无法扩展。

提前致谢。

有帮助吗?

解决方案

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

阅读博客了解更多详情和速度比较。

其他提示

基本上,您必须平衡创建连接与保持连接的成本。尽管MySQL在建立新连接方面非常快,但仍然需要花费在线程设置时间和Web服务器的TCP / IP设置时间。这在足够高的交通网站上是显而易见的。不幸的是,PHP对连接的持久性没有任何控制。所以答案是在很长一段时间内降低MySQL的空闲超时(比如降低到20秒),并提高线程缓存的大小。总之,这通常非常有效。

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

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

  

如果没有持久连接   任何增加的功能,是什么   他们有好处吗?

     

这里的答案非常简单 -   效率。持久的联系是   如果创建链接的开销很好   你的SQL服务器很高。是否   不是这个开销真的很高   取决于很多因素。像什么   它是一种数据库,无论是或   不是它坐在同一台计算机上   您的Web服务器所在的位置,方式   加载SQL服务器所在的机器   等等等等。 底线   如果那个连接开销是   高,持久的联系可以帮助你   相当即可。他们引起了孩子   只需连接一次的过程   因为它的整个生命周期,而不是   每次它处理一个页面   需要连接到SQL服务器。   这意味着对每个孩子而言   打开一个持久的连接会   有自己的开放持久性   连接到服务器。例如,   如果你有20个不同的孩子   运行脚本的进程   与SQL的持久连接   服务器,你有20个不同   与SQL服务器的连接,一个   来自每个孩子。

     

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

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

当我们使用时 mysql_connect() 函数,每次打开和关闭数据库连接时,都会根据请求而定。

但如果是 mysql_pconnect() 功能:

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

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

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

<强> 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-和mysql_pconnect /

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top