Persistent Database Connections

一、    什么是php持久化连接?

在java语言编程中,我们常常用到数据库连接池这个概念:数据库连接使用完毕后,并不会真正地关闭它,而是标记关闭,并释放到池中,等待下次请求继续复用。这大大节省了建立连接的开销。
在php中,类似的行为可以通过“Persistent Database Connections”(权且译做持久化数据库连接)来实现。
在php解析器收到请求时,会尝试利用主机地址、用户名、密码去寻找一个数据库连接,如果连接已经存在,就直接使用;如果不存在,就创建一个,且仅此一个。在请求处理过程中,无论调用几次数据库操作、处理多少次请求,都是利用这同一个数据库连接。这就是PHP持久化连接。
可能有人会问,这样的连接和“非持久化连接”能有什么不同呢?要弄清楚这个问题,可能要从web server + php处理请求的原理说起。

二、    Web server如何工作?

在php的世界中,web server主要有三种提供服务的方式:
1.    CGI wrapper
在这种方式下,每当server收到一个请求,就会创建一个php解析器来提供服务;当请求结束,解析器也就会被销毁。可以这样理解,在这种情况下,php资源是“一次性使用”的,所以持久化连接在这种场合没什么效果。
2.    module
这是目前最常见的服务方式。在这种方式下,php作为一个模块嵌入在apache服务器中提供服务。在apache这样的多进程服务器中,一般会有一个进程来充当父进程,而其他进程充当子进程,常见的web页面请求就是由这些子进程来完成的。同一个子进程,可能会按顺序地为不同浏览器的不同请求提供服务;而同一个浏览器的几次请求,也可能是有不同的子进程来完成的。在这样的情形中,php持久化连接就派上了用场:一旦连接建立,当子进程再不断地满足新的请求时,它都是使用的这同一个数据库连接;不会随意关闭、丢弃连接,也不会反复地创建新连接。
3.    plugin
如果使用Microsoft IIS、iPlanet、O’Reilly’s WebSite Pro等服务器提供php服务,就需要把php解析器当作插件来使用。在这种情况下,状况和2中类似。

三、    持久化连接的效果

1.    正面效果
正面效果已经从上文的描述中体现出来了:节省建立连接所花费的开销。如果你给服务器配置了20个服务进程,那么就会创建最多20个数据库连接。不会让数据库连接数不可预期,也不会反复地创建销毁连接。
2.    负面效果
如果你的数据库连接数有限,少于提供服务的进程数,那么就会有进程因为得不到数据库连接而阻塞。

四、    附录

以上内容编译自php官方文档:http://php.net/manual/en/features.persistent-connections.php,有错误之处请不吝指出。

Leave a Reply

Your email address will not be published.


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>