prefork
"It's probably not advisable to use prefork unless you need a module that's not thread safe."
prefork模式,很古老,非常稳定的模式,不建议使用的模式,除非是在使用一个非线程安全的模块。
为了减少频繁创建和销毁进程的开销,Apache在启动之初,预先fork一些子进程,然后等待请求进来。
每个子进程只有一个线程,在一个时间点内,只能处理一个请求。
优点:成熟稳定,兼容所有新老模块。
MOD_PHP拓展不需要支持线程安全,不需要担心线程安全的问题。
缺点:一个进程相对占用更多的系统资源,消耗更多的内存。
不擅长处理高并发请求,高并发场景下会将请求放进队列中,
一直等到有可用进程,请求才会被处理。
使用场景:
尽量不推荐在此模式下裕兴,除非模块无法在线程模式下运行。
PHP在非线程安全模下,推荐使用FastCGI和php-fpm模式。
"it's just been moved from 'experimental' to 'stable' status in Apache 2.4."
event MPM,需要Linux系统(Linux 2.6+)对EPoll的支持,同时建议在httpd 2.4.x版本下使用。
event和worker模式很像,解决了keep-alive场景下,长期被占用的线程的资源浪费问题。
event MPM中,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放,增强了高并发场景下的请求处理能力。
event MPM在遇到某些不兼容的模块时会失效,将会回退到worker模式,一个工作线程处理一个请求。
使用场景:
使用apache httpd 2.4,同时使用到多线程,event是最佳的运行模式。
httpd 2.2.x文档下:
Warning
This MPM is experimental, so it may or may not work as expected.
This MPM does not perform well on older platforms which lack good threading, but the requirement for EPoll or KQueue makes this moot.
To use this MPM on FreeBSD, FreeBSD 5.3 or higher is recommended. However, it is possible to run this MPM on FreeBSD 5.2.1, if you use libkse (see man libmap.conf).
For NetBSD, at least version 2.0 is recommended.
For Linux, a 2.6 kernel is recommended. It is also necessary to ensure that your version of glibc has been compiled with support for EPoll.