首页  >  问答  >  正文

mysql pconnect长连接是这样理解吗?

MySQL pconnect长久连接,是这样理解吗?
有三个用户A、B、C正在访问网站。如果开启了pconnect长连接的,那么:

第一种理解

A用户请求/index.php,/index.php连接mysql,返回到客户端浏览器。
B用户再去请求/index.php,那么是不是就直接用A用户连接到数据库的那个连接了
同理C用户也是这样用的同一个连接

第二种理解

A用户请求/index.php,暂停10分钟未有第二次请求
10分钟之后,再次请求/index.php,那么php使用数据库连接还是原先的那个。
且不管A用户之后请求该网站的任何其他PHP,PHP连接数据库都是用的一开始那个连接?
那时间是永久的?可以支撑多久?

同一时刻,B用户去请求/index.php,他重新开一个长久连接,与A用户开启的那个是不一样的
黄舟黄舟2732 天前803

全部回复(2)我来回复

  • 大家讲道理

    大家讲道理2017-04-17 11:33:47

    看php在web服务器上寄生状态是什么样的 如果是 nginx+phpcgi的方式 那么长连接 是由每个cgi程序自己保持的,和用户请求页面的地址无关,只要是数据库的ip和端口用户名不变则不会断开连接,即使用户请求一次页面之后 关闭页面 连接也会保持一定时间,有点像phpcgi 自己保持了一个连接池,可以在mysql 中用 show processlist 查看 。假如是apache的方式可能pconnect 和connect 是一样的。因为apache+module的方式 php的解析器等于每次都要重新初始化。

    回复
    0
  • ringa_lee

    ringa_lee2017-04-17 11:33:47

    PHP 的不是很清楚,Python 对于 Mysql 数据库操作我做过实验。

    • 第一种方案是单例连接web 服务初始化的时候,例如启动 Flask 或者 tornado,进行数据库 Mysql 的连接,这个连接有超时的设置,一旦超时了,会自动重新连接。所有请求都共享这个连接进行数据库查询操作,简单来说就是这个连接时一个单例。使用的数据库驱动封装为 torndb
    • 第二种方案就是使用数据库连接池,服务初始化的时候,启动若干个连接,扔进数据库连接池,然后请求就从连接池中取出连接进行查询,查询完毕之后,释放连接回到连接池。可参考的代码

    测试了并发请求效率,第一种方案处理请求能力更强,Mysql 占用资源更小。

    回复
    0
  • 取消回复