我正在使用本教程在我的新 Web 服务器上安装 nginx、php 和 mysql。
本教程使用 ISPConfig 3,并且可以选择使用 FastCgi 还是 PHP-FPM。
我想知道两者哪个更好。就性能和速度而言,这两者中哪一个最好用 inline 与 nginx 一起使用?
顺便说一句,我还在我的服务器上启用了 memcached 和 xcache。
PHP-FPM 比 PHP 的旧 FastCGI 处理要好得多。从 PHP 5.3.3 开始,PHP-FPM 成为核心,旧的 FastCGI 实现不再可用。
我的回答刚刚被否决(在网上很长一段时间后),我明白为什么,所以这里列出了为什么 PHP-FPM 实际上比旧的 FastCGI 实现更好。
首先,FastCGI 的实现在 PHP 社区中很糟糕,这已经有一段时间了。可以在https://wiki.php.net/ideas/fastcgiwork找到的文档页面,其中显示:
如果没有额外的“拐杖”(例如来自 lighttpd 发行版的 spawn-fcgi 或 php-fpm 补丁),php-cgi 在生产环境中是没有用的。这个项目假设集成了这样的“拐杖”并扩展了 php-cgi 以支持不同的协议。
- 守护进程(分离、创建 pid 文件、设置环境变量、setuid/setgid/chroot)
- 优雅重启
- 分离和改进传输层以支持不同的协议
- 支持 SCGI 协议
- 支持 HTTP 协议的子集
- …</li>
以下是从http://php-fpm.org/about/获取的 PHP-FPM 做得更好的列表:
- PHP守护进程
setsid()
:pid文件、日志文件、、、、、setuid()
setgid()
chroot()
- 流程管理。能够“优雅地”停止和启动 PHP 工作者,而不会丢失任何查询。这允许在不丢失任何查询的情况下逐步更新配置和二进制文件。
- 限制请求可以来自的 IP 地址。
- 动态进程数,取决于负载(自适应进程生成)。
- 使用不同的 uid/gid/chroot/environment 和不同的
php.ini
选项启动工作人员(不需要安全模式)。- 记录
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 方面:
在 php-fpm 方面: