background image

结束的时候,任何其他的连接都无法再获得数据库连接,当这些操作结束了,相应的连
接会被放入进程池,此时 Apache 的进程池里就有了 200 个空闲的子进程,其中 100 个是
带有数据库连接的,由于 Apache 会为访问请求随机的挑选空闲子进程,所以你得到的子
进程很可能是不包含数据库连接的那 100 个中的一个,而数据库连接已经达到了最大值,
你也不可能成功的建立新的数据库连接,唉,你便只好不停的刷新页面,哪个时候运气
好,碰巧分配到了带有数据库连接的子进程,才能正常浏览页面。如果是大访问量的网站
来说,任何时候都可能存在大量的并发,所以浏览者可能就会不停的发现无法连接数据
库的现象了。
或许你会说,我们把 Apache 和 MySQL 的最大连接数调成一样大不就可以了么?是的,
合理的调整这个最大连接数某种程度上会避免这个问题的发生,但是 Apache 和 MySQL
的负载能力是不同的,如果按照 Apache 的负载能力来设置,对于 MySQL 来说,这个最

 

大连接数就偏大,会产生大量的 MySQL 数据库永久连接,打个比方,就好像和平时代
还要养活一个几百万的军队一样,其开销得不偿失;而如果按照 Mysql 的负载能力设置,

 

对于 Apache 来说,这个最大连接数就偏小,有点杀鸡牛刀的感觉,无法发挥 Apache 的
最大效率。
所以按照 PHP 手册上的介绍,只适合在并发访问不大的网站上使用数据库永久连接,但
对于一个并发访问不大的网站来说,使用数据库永久连接带来的效率提高似乎没有太大
的意义,从这个角度上来看,我觉得 PHP 中的数据库永久连接基本上是一个鸡肋的角色,
如果你一定要使用数据库连接池的概念,可以尝试一下 sqlrelay 或者 Apache 本身提供的
mod_dbd,说不定会有惊喜。