首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP持久化连接池而不需要-> --可能吗?

问PHP持久化连接池而不需要-> --可能吗?
EN

Database Administration用户
提问于 2012-04-07 10:39:39
回答 2查看 16.9K关注 0票数 15

一段时间以来,我一直在努力想出一种很好的方法。但很难找到合适的部分来做这件事。我猜这一定是可能的。

简单地说,这就是我想要完成的:

代码语言:javascript
复制
PHP / Other front end -> [SOCKET] ->

Locally hosted 'pooler' -> [Pool of persistent TCP/IP connection(s)]->

Externally hosted MySQLD

这种做事的工具/方式存在吗?

我们基本上希望在不使用mysql_pconnect的情况下实现持久的mysql连接。

我恭敬地要求我们不要开始讨论如何不需要持久的联系,等等。我们正在耗尽TIME_WAIT端口,如果实现这种类型的系统,还有其他问题需要解决。

所以是的,总之.我们将实现一个mysql连接池,它是基于本地端的套接字,并将连接保存到外部托管的mysql服务器(LAN)。

我们不使用事务或任何可能受到正在回收的mysql连接影响的东西。

我们在前端使用主+主Percona5.5集群运行linux。

谢谢!

EN

回答 2

Database Administration用户

回答已采纳

发布于 2012-04-12 09:12:39

经过一番探索,我终于找到了解决办法。

我不是个作家,所以我会尽我最大的努力使这篇文章尽可能简洁。

据我所知,有两种可能的解决方案:

SQL中继

http://sqlrelay.sourceforge.net/

这正是问题所要求的,还有更多。我不会对我所能找到的细节做太多的解释,但是我会提到它并不是一个可行的解决方案,因为它不透明。这意味着流程如下:

代码语言:javascript
复制
PHP -> Queries -> SQL Relay Extension -> SQL Relay -> Externally hosted MySQL

因此,这将涉及重写我们所有的代码,从mysql到sql中继。在我们的情况下没有选择。

尽管如此,如果有人正在计划一个新的大型项目,需要SQL所拥有的众多特性中的任何一个,那么它听起来很漂亮。

Mysql代理

http://forge.mysql.com/wiki/MySQL_代理

这就是我们最终使用的解决方案。

让它做我们想做的事情的关键是将LUA脚本池用于mysql代理。

该LUA分机可在以下网址找到:

https://github.com/cwarden/mysql-proxy/blob/315ab806bb95b8223f5afd3d238eff2a40af03d8/lib/ro-pooling.lua

没有过多的细节,这里有一些基本的统计数据..。考虑到这一点,这是在低使用时间进行测试的:

代码语言:javascript
复制
[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
   6433   38598  572537

在切换到mysql代理之后,让事情解决:

代码语言:javascript
复制
[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
     32     192    2848

正如您可以清楚地看到的那样,mysql的TIME_WAIT端口已经下降到几乎没有。

这些连接现在实际上是持久化的,无需使用mysql_pconnect / mysqli_connect( .P:主机名. )。

值得一提的是,在池程序lua脚本顶部附近似乎有一些可配置的设置。

局部min_idle_connections

和

局部max_idle_connections

这些似乎是相当不言自明的。除了:似乎每个用户名(和密码?)未经测试..。最有可能不是这样的。)组合创建了自己的一组持久连接。

因此,将max_idle_connections乘以将连接到数据库的唯一mysql用户的数量。这应该让你知道你最终会有多少空闲的连接。

因此,让我重申一下,这个简短的短文为那些通过google搜索的人打了几个关键词:

当使用

时,是否可以在没有mysql_pconnect?

的情况下拥有持久的mysql连接?

是的,这可以通过SQL完成,如果您不介意重新构建大部分代码来通过其扩展或透明地使用mysql代理和ro池. via脚本来传输查询。

我们想要这样的东西已经有一年了。

享受吧!

票数 12
EN

Database Administration用户

发布于 2012-04-12 05:23:58

  1. mysqli扩展在PHP5.3中引入了持久连接支持。PDO MYSQL和ext/mysql已经提供了支持。持久连接背后的思想是客户端进程和数据库之间的连接可以被客户端进程重用,而不是被多次创建和销毁。这减少了每次需要新连接时创建新连接的开销,因为未使用的连接被缓存并随时可重用。
  2. 与mysql扩展不同,mysqli不提供单独的函数来打开持久连接。若要打开持久连接,必须在连接时将p:添加到主机名。
  3. 持久连接的问题是,客户端可能会使它们处于不可预测的状态。例如,在客户端意外终止之前,可能会激活表锁。重用此持久连接的新客户端进程将获得“原样”连接。任何清理都需要由新的客户端进程来完成,然后才能很好地利用持久连接,从而增加程序员的负担。

然而,mysqli扩展的持久连接提供了内置的清理处理代码。由mysqli进行的清理工作包括:

代码语言:javascript
复制
Rollback active transactions

Close and drop temporary tables

Unlock tables

Reset session variables

Close prepared statements (always happens with PHP)

Close handler

Release locks acquired with `GET_LOCK()`

这确保了在客户端进程使用连接池之前,从连接池返回的持久连接处于干净状态。

mysqli扩展通过自动调用C函数mysql_change_user()来进行清理。

但是,自动清理功能有其优点和缺点。优点是程序员不再需要担心添加清理代码,因为它是自动调用的。但是,缺点是代码可能会慢一点,因为每次从连接池返回连接时,执行清理的代码都需要运行。

通过编译具有MYSQLI_NO_CHANGE_USER_ON_PCONNECT定义的PHP,可以关闭自动清理代码。

注:

当使用MySQL本机驱动程序或MySQL客户端库时,mysqli扩展支持持久连接。

您还可以参考以下链接:http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/

票数 5
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/16201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档