橡皮擦擦

对比 PHP 各种运行模式

技术杂谈

PHP的四种运行模式以及简介说明:

  1. Apache + mod_php 直接挂载模块运行代码,无进程通讯;
  2. Nginx + php-fpm 通过 FastCGI 处理进程间通讯;
  3. Cpanel、DirectAdmin 所使用的 suPHP 相当于 CGI 模式;
  4. Swoole Http Server 由Swoole提供的高性能服务器;

Apache + mod_php

几年前 LAMP(Linux Apache MySQL PHP)非常火爆,然而现在使用 Apache 似乎有一点非主流的味道。大众对 Apache 的印象是速度慢,配置难。不过到了 Apache 2.4,性能已经基本和 Nginx 相当。

我们选择 Apache 的主要原因是他可以直接将 PHP 当作一个模块挂载在进程中运行,选择 Prefork 预派生进程模式,Apache 会维护一个进程池,提前启动一群 httpd 进程等待请求进来,可以直接在进程中运行 PHP 并返回处理结果。处理完成后进程不会退出,而是继续等待下一个请求。

结合 Apache 的 .htaccess 可以实现无需重启即可重载绝大多数配置,可以让用户非常自由的定制各项配置参数。因此这是性能最好、配置最灵活的方案。

不过这样运行的进程全部的系统用户都是同一个,安全方面就需要十分谨慎,其它虚拟主机厂商无法使用的原因是用户可以非常轻松的跨到其它虚拟主机去读数据,非常危险。

Nginx + php-fpm

在大多数人眼中,Nginx 和 Apache 扮演的角色是一样的。其实不是,Nginx 是一个反向代理服务,而 Apache 是一个可以直接运行 PHP 的 HTTP 服务。也就是说,除了 PHP 之外,NodeJS、Golang 等语言在运行的时候,都是需要自行处理 HTTP 或者 FastCGI 协议的,Nginx 只管将 HTTP 请求或者是 FastCGI 转发给其它进程。而 Apache 则是直接在自己进程内部完成 PHP 的运行并直接返回结果。

因此 Nginx 在运行 PHP 时,需要 PHP 自己启动 php-fpm 管理一个进程池,并监听在一个 TCP 端口(最常见的 9000 / 9001)或者 Unix Socket 等待 Nginx 通过 FastCGI 转发请求过来。所以性能方面无论如何都躲避不了进程通讯的 IO 性能消耗,这点不如 Apache 性能好。

不过鉴于大多数运维都比较熟悉 Nginx 的配置文件,配置项相比 Apache 也稍微简单一些,因此一些自己维护服务器的运维会选择这个模式。

suPHP(类似 CGI)

大概 10 年前,CGI 是最流行的运行动态网站所使用的接口标准。在一个请求到达 HTTP 服务(Apache)之后,HTTP 服务会根据 CGI 配置通过命令启动一个进程处理这一请求,处理完成之后再关闭进程。

相信读到这里,我不需要做性能对比,读者就明白这肯定是性能最差的方案。那么虚拟主机厂商为什么都喜欢这个模式?因为使用 Cpanel、DirectAdmin 等方案的他们没有比较好的用户隔离方法,只能通过新建不同的 Linux 系统用户运行 PHP 来隔开用户。

suPHP 模块可以实现当请求到达 Apache 之后,判断这个虚拟主机归属哪个用户,通过对应用户启动一个 PHP 进程来处理,并在处理完成之后关闭这个进程。因此是市面上虚拟主机最常用的模式。

Swoole Http Server

通过使用apache bench工具进行压力测试,在Inter Core-I5 4核 + 8G内存的普通PC机器上,swoole_http_server可以达到近11万QPS。远远超过php-fpm,golang自带http服务器,node.js自带http服务器。性能几乎接近与Nginx的静态文件处理。

部分内容摘自:九零创新实验室

点我评论
打赏本文
二维码


36

文章

6

分类