据我所知,有四种不同的 PHP 处理程序(AFAIK)。
- CGI (php-cgi)
- FastCGI (php-fpm)
- Mod_PHP
- 苏普
我需要了解这些处理程序的优缺点以及各自适合什么环境?
例如,如果我正在运行共享托管服务器,上述哪种处理程序适合我?或者如果我正在管理私人服务器?
答案1
这些实际上并不是“6 种 PHP 类型”,而是两种 PHP 类型,每种类型在 3 种不同的 Apache 实现中运行。
suphp、suphp_worker 和 suphp_event
苏普本身是 PHP 的一个包装器,在给定的用户权限(例如,与 Apache 运行的权限不同)下运行 PHP,再加上一个 Apache 模块(mod_suphp),允许您运行 suPHP - 基本上是在 CGI 模式下。简化的 CGI 模式意味着,传递到 PHP 的每个请求都会启动一个新的 PHP(运行时)进程。就 CPU 使用率而言,这很昂贵,而且与持久的 PHP 运行时相比速度较慢(我猜大约是 3-5 倍)。
我认为第一个变体使用Apache 的 prefork MPM,与其他 MPM 相比,它被广泛使用和测试,但速度较慢。Prefork 的作用正如其名称所暗示的那样:它分叉一定数量的 Apache 进程并让它们可用于传入请求。
下一个(suphp_worker)使用工人 MPMWorker 是预生成的进程和线程的混合体,通常比 prefork 更快(用于传递静态内容大约两次) 并且占用更少的内存。
最后一个(suphp_event)似乎使用suPHP +MPM 事件,它再次使用了不同于 worker 的进程/线程模型。从我见过的基准测试,事件和工作者的速度大致相同 - 事件 MPM(至少使用 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,Apache prefork MPM 的一个分支,具有在给定用户权限下运行每个 VirtualHost 的选项。它还使您能够对每个 VirtualHost 实施额外的限制(例如客户端数量)。
建议
如果这些是您唯一的选择,并且您在您的机器上“独自一人”(也就是说:您不打算共享主机)我可能会坚持使用好的 mod_php。
如果您计划建立多个网站,则需要检查您的优先事项:
- 安全性优于性能:使用 suphp_worker。两者(worker MPM 和 suPHP)都经过了广泛测试,为您提供了良好的安全性起点。静态文件的性能应该不错,而 PHP 则不然。
- 性能高于安全性:可能是 mod_php_ruid2,但仅仅是因为我对 ITK 的体验不好。
我确实更喜欢使用第三个选项,即使用 FastCGI,它为您提供了更多分离权限和访问权限的可能性 - 但这似乎没有提供。