论坛首页 编程语言技术论坛

为什么不推荐在apache中使用线程化的MPM

浏览 3967 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-07-25  
PHP
问题:为什么不应该在实际运作环境中的 Apache2 中使用线程化的 MPM?

php手册上回答:

引用
PHP 是粘合剂。它将几十种第三方的库粘合到一起来创建很酷的 web 应用,并通过很直观且易于学习的语言界面使其看上去好像一个整体。PHP 的灵活与强大依赖于底层平台的稳定与耐用。起码需要将一个可运作的操作系统,一个可运作的 web 服务器以及可运作的第三方库粘合起来。其中任何一方不运作了,PHP 都需要有方法来识别出问题并且快速解决。如果没有完全独立的执行线程,完全独立的内存单元和稳定的空间对付每个请求,那底层架构就太复杂以至于不稳定因素更容易进入到 PHP 系统中。

如果必须要用线程化的 MPM,看看 FastCGI 配置,使 PHP 运行于自己独立的内存空间中。

最后需要指出,不使用线程化 MPM 的警告在 Windows 系统中没那么强烈,因为 Windows 中的大多数库都理应在多线程下安全运行。


我这里没怎么看懂,他说的是因为多线程的MPM本身不稳定啊还是多线程的MPM会造成PHP不稳定啊?又为什么?
   发表时间:2008-07-25  
是很多第三库多线程不安全。
0 请登录后投票
   发表时间:2008-07-26  
iunknown 写道
是很多第三库多线程不安全。

既然不推荐php和多线程一起用,那么在配置fastcgi模式时,每个进程也必须一个线程? 对吗?
0 请登录后投票
   发表时间:2008-07-26  
xombat 写道
iunknown 写道
是很多第三库多线程不安全。

既然不推荐php和多线程一起用,那么在配置fastcgi模式时,每个进程也必须一个线程? 对吗?


apache 1.3 系列,在 unix/linux 平台,主要是用 prefork 模型,这个就是多进程模型,每个进程同一时间只服务一个请求。在 apache 2.x 系列中,在 unix/linux 平台,增加了 worker 模型,同样也是有多个进程,但是每个进程内部会创建多个线程,也就是同一个进程在同一时间会服务多个请求。在 worker 模型中,如果用了多线程不安全的函数,那么就有可能导致出错。例如:如果程序里面用了 char *ctime(const time_t *clock); 这一类使用了内部 static 内存的函数,就有可能产生非预期的结果。

目前针对 apache 的主要的 fastcgi 实现主要是 http://www.fastcgi.com/ 和 http://fastcgi.coremail.cn/doc.htm 。

看过 coremail fastcgi 的一些实现代码,它的 fcgid 有自己的 process manager,fcgid 的模型目前只有 prefork 一种。apache 和 fcgid 之间用 unix domain socket 来通信。这也就是说,如果使用 coremail 的实现,那么 apache 配置成什么模型,并没有关系,因为 php 实际是运行在 fcgid 控制的子进程中,而不是 apache 的子进程中。

对于其他的 http 服务器的 fastcgi 实现没有具体看过,不太了解情况。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics