PHP处理程序(CGI vs FastCGI vs Mod_PHP vs suPHP)有什么区别?

我知道有四个不同的PHP处理程序(AFAIK)。

  • CGI(php-cgi)
  • FastCGI(php-fpm)
  • mod_php的
  • suPHP

我需要知道这些处理程序的优缺点,以及哪些环境适合于哪些环境?

例如,如果我正在运行一个共享的托pipe服务器上面哪个处理程序适合我? 或者,如果我pipe理私人服务器?

这些并不是真正的“6种PHPtypes”,而是两种PHPtypes,每种都运行在3种不同的Apache实现中。

suphp,suphp_worker和suphp_event

suPHP本身就是PHP的一个包装器,在给定的用户权限(例如与Apache运行的权限不同)下运行PHP以及允许运行suPHP的Apache模块(mod_suphp) – 基本上是在CGI模式下运行。 CGI模式的简化意味着,每个传递给PHP的请求都会启动一个新的PHP(运行时)进程。 就CPU使用而言,这是很昂贵的,与一个持久的PHP运行时相比要慢一些(大约是我猜测的3-5倍)。

我认为这个第一个变种使用了Apache的prefork MPM ,与其他MPM相比,它被广泛使用和testing,但速度相当慢。 Prefork做它的名字意味着:它分叉给定数量的Apache进程,并保持它们可用于传入的请求。

下一个(suphp_worker)改为使用worker MPM 。 Worker是预先产生的进程和线程的混合体,通常比prefork(用于传递约两倍的静态内容)更快并且使用更less的内存。

最后一个(suphp_event)似乎使用suPHP + MPM事件 ,它再次使用另一个进程/线程模型比worker。 从我看到的基准testing中 ,事件和工作人员的速度大致相同 – 事件MPM(至less使用Apache 2.2,您的提供者可能会这样做)被标记为实验性的。

mod_php,mod_php_ruid2和mod_php_itk

这是一种不同的PHP处理程序实现:Apache预先启动一个PHP运行时并将传入的请求传递给它,根据需要产生新的进程。 这比suPHP快得多,但是没有用户权限分离的缺点:所有的php进程和Apache本身都有相同的权限运行。

第一个变体可能使用prefork MPM(上面描述),因为mod_php与worker或event的线程模型不兼容。

第二个变体(mod_php_ruid2)似乎还使用了Apache模块mod_ruid2 ,它允许您在不同的用户权限下运行每个Apache VirtualHost – 这包括PHP进程。 它有一个长长的不兼容的列表 ,你应该考虑。

最后一个变体(mod_php_itk)使用Apache的第三方ITK MPM ,这是Apache prefork MPM的一个分支,该选项在给定的用户权限下运行每个VirtualHost。 它还使您能够执行每个VirtualHost的额外限制(例如客户端数量)。

build议

如果这些是你唯一的select,而你在你的机器上“一个人”(又名:你不打算共享主机),我可能会坚持与良好的“mod_php”。

如果你正在计划多个网站,你需要检查你的优先事项:

  • 性能安全性:使用suphp_worker。 (工人MPM和SUPHP)都经过了广泛的testing,为您提供了一个很好的安全起点。 性能为静态文件应该是好的,PHP没有那么多。
  • 性能超过安全:可能是mod_php_ruid2,但只是因为我有与ITK不好的经验

我更喜欢使用第三个选项,它使用FastCGI,给你更多的可能性来分开权限和访问priviliges – 但这似乎并没有提供。