- 论坛徽章:
- 0
|
原帖由 bs 于 2007-8-31 16:21 发表 ![]()
我想楼上的只知其一不知其二,手册只是基础
我也引用一篇网上的文章:
[quote]在某些场合,mysql_pconnect( ) 是不适用的。
--------------------------------------------------------------------------------
状况一:
使用 1 部 web server 与 1 部 MySQL server(两者可能同在一部主机上),而 web server 固定只对 MySQL server 上的某一个数据库进行存取动作。
因为每次存取数据库时,都是由 web 那边使用同一账号对 MySQL 上的同一数据库作业,若我们将 MySQL 与 web server 的「同时联机数」都调整为 200,就好像 MySQL 这边一直有 200 位「服务生」,随时等着接待来自 web 的 200 位「顾客」似的。而且「顾客」离开之后,「服务生」也不下场休息,时时都站在门口等着接待下一个「顾客」。
在这种情况下,您只要注意将 MySQL 的「同时联机数」调得比 web server 的高或相等,就会发现使用 mysql_pconnect( ) 是个不错的选择。
--------------------------------------------------------------------------------
状况二:
使用 1 部 web server 与 1 部 MySQL server(两者可能同在一部主机上),而 web server 会对 MySQL server 上的两个数据库进行存取动作。
从 web server 那边提出数据存取需求时,有时是针对第 1 个数据库(DB1),有时则是针对第 2 个数据库(DB2)。若我们也将 MySQL 与 web server 的「同时联机数」都调整为 200,这样一来,就好像 MySQL 这边有 200 位「服务生」,但同时经营两个「吧台」(DB1 与 DB2),而「顾客」可能多达 200 位。
一开始,DB1 这个「吧台」比较热门,MySQL 派了 150 位「服务生」上场接待;同样地,当「顾客」离开之后,这 150 位「服务生」仍守着 DB1 而不下场休息。后来,DB2 那边也热闹起来了,「顾客」越来越多,MySQL 得加派「服务生」上场,有几个能派?答案是 50 个!
为什么「服务生」的人力调配会捉襟见肘?那是因为 web 那边使用了 mysql_pconnect( ) 来建立联机。「服务生」一开始被指定到哪个「吧台」工作,就会持续在那边停留,绝不「转台」。
--------------------------------------------------------------------------------
请注意,当使用持续性的联机时,每个已建立的联机只为来自同一部 web server、使用同一组账号,且存取同一数据库的使用者服务。
如此一来,假设每部 web server 的「同时联机数」都是 200,而且同时使用 2 部 web server 会怎么样呢?从 web1 来了 50 个「顾客」,先是到 DB1 走一趟,接着再到 DB2 晃一圈,这样需要多少「服务生」接待他们?100 个(web1->DB1: 50 web1->DB2: 50)!又从 web2 来了 50 个「顾客」,也做了同样的动作(web2->DB1: 50 web2->DB2: 50)。在此之后,还有「服务生」是闲着的吗?后续若从 web1 或 web2 同时涌入多于 50 位「顾客」时,谁来应付他们?
倘若您使用的是像 Apache 这类的 multi-process web server(一个 parent process 协调一组 children processes 运作),某个 children process 建立的「持续联机」,是不能分享给其它 children process 来使用的(「服务生」只对先前接待过的「顾客」服务)。在这样的情况下,将会使得 MySQL 上闲置的 process 越积越多(很多「服务生」站在门口等着「老顾客」上门,而不理会「新顾客」)。
mysql_pconnect( ) 一定是最佳选择吗?我想未必尽然。
[/quote]
我想告诉你的是:「重复使用」四个字分为「重复」和「使用」两个词。这个词组的意思是,使用完后可以再利用。而不是说,A 还没用完 B 就可以用了。这个是并发的问题而不是重复使用的 bug。如果你还不懂,那么请看下面这个例子:
- A 和 B 和 C 分别为三个 apache process,都使用 mysql_pconnect:
- A------------>|
- B------------->|
- C------------>|
- ----------------------------------
- 时间 ----------------------->
复制代码
竖线表示使用完成。上面这种情况,就必须有 3 个并发连接,并且不能重复使用,因为 A、B、C 在需要数据库连接的时候,前面的人还没有用完。而众所周知 pconnect 是不会关闭连接的,所以就会有 3 个 sleep 的 mysql process。所以你认为这种情况是「没有重复使用」的原因吗?
另外,关于你的引用,特别是你(注意是你自己)标注成红色的部分,和手册是有冲突的:
The second, and most popular, method is to run PHP as a module in a multiprocess web server, which currently only includes Apache. A multiprocess server typically has one process (the parent) which coordinates a set of processes (its children) who actually do the work of serving up web pages. When a request comes in from a client, it is handed off to one of the children that is not already serving another client. This means that when the same client makes a second request to the server, it may be served by a different child process than the first time. When opening a persistent connection, every following page requesting SQL services can reuse the same established connection to the SQL server.
第二,也是最常用的方法,是把 PHP 用作多进程 web 服务器的一个模块,这种方法目前只适用于 Apache。对于一个多进程的服务器,其典型特征是有一个父进程和一组子进程协调运行,其中实际生成 web 页面的是子进程。每当客户端向父进程提出请求时,该请求会被传递给还没有被其它的客户端请求占用的子进程。这也就是说当相同的客户端第二次向服务端提出请求时,它将有可能被一个不同的子进程来处理。在开启了一个永久连接后,所有请求 SQL 服务的后继页面都能够重新使用这个已经建立的 SQL Server 连接。
如果我理解没有错误,那么手册是说 persistent connection 是可以在子进程中共享的,当然,关于这个我也在本机测试了。如果两者一定要选一个来相信,那么我相信手册,也相信自己测试的结果。
根据你的上一个回帖,你并没有认真去看手册,甚至我给你说了两页,就两页,最为直接相关的手册页面,你也没有认真看过。No offence,但我觉得你这是对我的不尊重。
PS: 如果可以请给辛苦分 10 分,谢谢。 |
|