PHP连接池MySQL

20

我计划使用MYSQL。是否有可用的连接池扩展?或连接的正常实践是什么? 这是到处都使用的那个吗...

mysqli_connect("localhost", "xxx", "xxx", "test");

人们是使用普通的mysql_connect还是pconnect..? pconnect有多好,我应该为PConnect做什么设置?

6个回答

24
你有使用过 mysql_pconnect() 吗?mysql_pconnect()mysql_connect() 很相似,但有两个主要区别。
首先,在连接时,该函数会首先尝试查找与同一主机、用户名和密码的 (持久) 链接是否已经打开。如果找到,则返回其标识符而不是打开新连接。
其次,当脚本执行结束时,与 SQL 服务器的连接不会被关闭。链接将保持打开以供将来使用(mysql_close() 不会关闭由 mysql_pconnect() 建立的链接)。
因此,这种类型的链接称为“持久链接”。 在这里查看: 这里

10
在PHP 5.3中,mysqli扩展引入了持久连接支持。PDO MYSQL和ext/mysql已经支持了此功能。持久连接的思想是,客户端进程和数据库之间的连接可以被客户端进程重用,而不是被创建和销毁多次。这样可以减少每次需要时创建新连接的开销,因为未使用的连接被缓存并准备好重用。
与mysql扩展不同,mysqli没有提供单独的函数来打开持久连接。连接时必须在主机名前加上p:
来源: http://www.php.net/manual/en/mysqli.persistconns.php
sample code:
$GLOBALS["mysqli"] = new mysqli('p:localhost', 'username', 'password', 'db_name');

编辑:抱歉重复了,没有看到其他答案。


4

3
自 PHP 5.3 起,mysqli 支持持久连接,只需在主机名前面添加 p: 即可。
如果您正在运行 Apache,请尝试使用 Apache mod_dbd 模块通过 mysql 进行连接池管理。它支持 MySQL 的连接池。 http://httpd.apache.org/docs/2.2/mod/mod_dbd.html

1
感谢您注意到持久连接的“p:”主机前缀需要PHP版本5.3。我在其他地方都没有找到这个小提示。 - Bob Stein

1

有3个连接函数:

mysql_connect:普通连接,没有池化,您无法执行存储过程(只能执行SQL)

mysql_pconnect:池化连接,您无法执行存储过程(只能执行SQL)

mysqli_connect:普通连接,没有池化,您可以执行存储过程(需要mysql 5或更高版本)

mysqli_pconnect:不存在。没有内置的连接函数既处理存储过程又进行池化

我的建议(通过经验和冲浪):

如果您需要存储过程,请省略池化并使用mysqli_connect

如果您不需要存储过程,请使用mysql_pconnect


0

在PHP中绝对可以使用连接池 - 但是您应该使用swooleopenswoole扩展,这些扩展带来了许多异步/并行化功能:
https://openswoole.com/docs/get-started/installation

之后,您可以使用普通的mysqlipdo PHP扩展来设置连接池。

请参阅以下示例:
https://github.com/open-smf/connection-pool
https://openswoole.com/docs/modules/connection-pool

一些框架已经为您处理了这个问题:
https://hyperf.wiki/2.2/#/en/pool

编辑:我使用smf连接池与mezzio微框架和openswoole,对于mysql和redis非常稳定。


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