PHP和MYSQL的持久化连接

只需要在new PDO($dns, $user, $passwd, array(PDO::ATTR_PERSISTENT => true)); 中,设置PDO::ATTR_PERSISTENT就表示是持久化连接。

在cli运行php程序,是没有持久化连接的,程序结束,mysql连接,也会自动断开。

对于做为apache模块运行的php来说,当用户发起请求后,apache会提供一个进程来进行服务。当连接断开后,mysql却把这个连接保存了下来。mysql根据apache的进程号(这个进程号可以根据getmypid查到),进行hash key, 保存到hash表中的。也就是说,一个mysql连接对应一个apache的进程号。当apache断开连接,mysql连接状态会变为sleep,并且有个time计时器,到wait_timeout时间内没有再次激活,这个连接会自动kill掉。如果重新激活,time会从0开始计时。

如果apache在prework下,apache启动时,就会生产一些进程放到连接池,当用户请求时,连接池会取出一个进程来响应。当连接池的进程足以应付用户的请求数量时,那么mysql连接数是稳定的。当用户数激增,apache会生成新的进程,mysql连接数也会增多。用户断开连接,很可能这个进程会消失,但是mysql连接还会一直存在,由于对应的进程id不在连接池中,利用率会很低,这时,很容易会出现连接数过多的情况。

当用户量访问分布平均,并且线程池中的进程足以应对,那么mysql的wait_timeout 可以设置的长一些。如果会出现大的访问量,wait_timeout应该小一些,这种情况下,长连接的意义就不大了。

mysql_pconnect使用长连接与PDO不同。比如相同的服务器和端口号,不同的两个库test1和test2。用户连接之后需要查询这两个库里的数据,PDO会生成两个连接,而mysql_pconnect是一个。mysqli_connect与PDO的行为是一致的。

此条目发表在MYSQL, PHP分类目录。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。