经过大量的搜索,我终于找到了解决方案。
我不是一个作家,所以我会尽力使它尽可能简洁。
据我所知,有两种可能的解决方案:
SQL中继
http://sqlrelay.sourceforge.net/
这正是问题所要求的,甚至更多。我不会详细介绍我能够找到的内容,但是会提到这不是可行的解决方案,因为它不透明。含义流程如下:
PHP -> Queries -> SQL Relay Extension -> SQL Relay -> Externally hosted MySQL
因此,这将涉及将我们所有的代码从mysql重写为sql relay。在我们的情况下不是一个选择。
话虽如此,如果有人正在计划一个新的大型项目,而该项目需要SQL Relay具有的众多功能中的任何一个,那么听起来就很美。
MySQL代理
http://forge.mysql.com/wiki/MySQL_Proxy
这就是我们最终使用的解决方案。
做到这一点的关键是执行MySQL代理的池化LUA脚本。
可以在以下位置找到该LUA扩展:
https://github.com/cwarden/mysql-proxy/blob/315ab806bb95b8223f5afd3d238eff2a40af03d8/lib/ro-pooling.lua
无需赘述,这里是一些基本统计信息...切记,这是在较低的使用时间下进行测试的:
[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
6433 38598 572537
切换到mysql-proxy之后,解决问题:
[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
32 192 2848
您可以清楚地看到,MySQL的TIME_WAIT端口几乎已消失。
现在,连接实际上是持久的,无需使用mysql_pconnect / mysqli_connect(... p:hostname ...)。
值得一提的是,pooler lua脚本顶部附近似乎有一些可配置的设置。
本地min_idle_connections
和
本地max_idle_connections
这些似乎很容易解释。除外:似乎每个用户名(和密码?未经测试...很可能不是这样)的组合都会创建自己的一组持久连接。
因此,将max_idle_connections乘以将要连接到数据库的唯一mysql用户数。这应该使您了解最终将拥有多少个空闲连接。
因此,让我重申一下,这个简短的内容会为通过Google搜索的用户找到一些关键字:
当使用PHP时,可以在没有mysql_pconnect的情况下保持持久的mysql连接吗?
是的,如果您不介意重建大多数代码以通过其扩展名将查询通过管道传递,或者通过使用带有ro-pooling.lua脚本的mysql-proxy透明地进行此操作,则可以通过SQL Relay完成。
大约一年以来,我们一直想要这样的东西。
请享用!
mysql_pconnect
一些“清理功能”来启动每个连接?