我正在使用这个教程在我的新web服务器上安装nginx, php和mysql。
本教程使用的是ISPConfig 3,可以选择使用FastCgi还是PHP-FPM。
我想知道两者中哪一个更好。在性能和速度方面,两者中哪一个是最好的内联使用nginx?
顺便说一句,我也在我的服务器上启用了memcached和xcache。
PHP- fpm比旧的FastCGI处理PHP要好得多。从PHP 5.3.3开始,PHP- fpm是核心,旧的FastCGI实现不再可用。
我的答案刚刚被否决(在网上出现了很长一段时间之后),我明白为什么,所以这里列出了为什么PHP-FPM实际上比旧的FastCGI实现更好。
首先,很长一段时间以来,FastCGI的实现在PHP社区中是很糟糕的。一个可以在https://wiki.php.net/ideas/fastcgiwork找到的页面,上面写着:
php-cgi在生产环境中没有额外的"拐杖"是没有用的(例如,从lighttpd发行版或php-fpm补丁生成-fcgi)。本项目假定集成了这些"拐杖",并扩展了php-cgi以支持不同的协议。
- 守护进程(分离,pid文件创建,设置环境变量,setuid/setgid/chroot)
- 优美的重启
- 分离和改进传输层以允许支持不同的协议
- 支持SCGI协议
- 对HTTP协议子集的支持
- …
下面是一个PHP-FPM做得更好的事情列表,摘自http://php-fpm.org/about/:
PHP守护:pid文件、日志文件、
setsid()
、setuid()
、setgid()
、chroot()
- 流程管理。能够"优雅地"停止和启动PHP工作线程,而不会丢失任何查询。这允许逐步更新配置和二进制文件,而不会丢失任何查询。
- 限制请求的IP地址。
- 动态进程数,取决于负载(自适应进程生成)
- 启动具有不同uid/gid/chroot/environment和不同
php.ini
选项的worker(不需要安全模式)。- 记录
STDOUT
和STDERR
.- 如果使用加速器,在意外破坏共享内存操作码缓存时紧急重启所有进程的能力。
set_time_limit()
失败时强制完成进程。附加功能:-错误报头-加速上传支持——
fastcgi_finish_request()
-慢日志与回溯
一个小更正:PHP FastCGI SAPI仍然可用,即使在PHP 5.5.x。
[root@zulu1 ~]# /usr/local/php54/bin/php-cgi -v
PHP 5.4.17 (cgi-fcgi) (built: Jul 18 2013 05:12:07)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
fastcgi的一面:
- Fastcgi更容易监控:在fastcgi中,每个用户有一个pid。在有许多帐户的web服务器上,很容易发现超载的进程。另一方面,php-fpm根据请求创建许多进程+一个主进程。当你有很多来自不同IP的连接时,这会很混乱。
- Fastcgi配置更容易:Fastcgi包含在apache配置中。这样事情就简单多了。另一方面,php-fpm需要额外的配置文件。如果有配置依赖,会让事情变得复杂。
- 大的共享主机公司仍然没有使用php-fpm在2015年的php 5.6今天,所有最大的共享网络托管公司(bluehost,hostgator,namecheap)都使用fastcgi。我认为他们不提供php-fpm作为php-handler的原因。
php-fpm端:
- 我注意到php-fpm消耗比fastcgi少20%,fastcgi消耗比mod_php少20%。因此,php-fpm适合具有最小内存的web服务器。