PHP-FPM(FastCGI Process ManagerFastCGI进程管理器)是一个PHPFastCGI管理器,对于PHP 5.3.3之前的php来说,是一个补丁包,旨在将FastCGI进程管理整合进PHP包中。如果你使用的是PHP5.3.3之前的PHP的话,就必须将它patch到你的PHP原始码中,在编译安装PHP后才可以使用。
相对Spawn-FCGI,PHP-FPM在CPU和记忆体方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而PHP-FPM则没有这种烦恼。
基本介绍
- 中文名PHP FastCGI进程管理器
- 外文名PHP-FPM
- 简介一个PHPFastCGI管理器
- 特色功能这些特性都是不打断的方式实现的
- 範围php.ini 选项
简介
从PHP 5.4 RC2开始,php-fpm已经转正了,不再被php团队标注为EXPERIMENTAL(实验性的东西)。
PHP5.3.3已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制记忆体和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以被PHP官方收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。
使用PHP-FPM来控制PHP-CGI的FastCGI进程
/usr/local/php/sbin/php-fpm{start|stop|quit|restart|reload|logrotate}
--start 启动php的fastcgi进程
--stop 强制终止php的fastcgi进程
--quit 平滑终止php的fastcgi进程
--restart 重启php的fastcgi进程
--reload 重新平滑载入php的php.ini
--logrotate 重新启用log档案
特色功能
所有这些特性都是“不打断”的方式实现的。也就是说,如果你不使用它们,它们的存在不会影响php的功能性——他们都是“透明”的。
Error header
範围php.ini 选项
分类便利性
默认情况下,如果被访问的php脚本包含语法错误,用户会收到一个空的“200 ok”页。这是不方便的。Error header 这个php.ini 选项允许在这种情况下产生一个 HTTP错误码,比如“HTTP/1.0 550 Server Made Big Boo”,从而中断web server请求并显示一个正确的错误页。
如果要实现这样的功能,需要在php.ini 中添加一条fastcgi.error_header = "HTTP/1.0 550 Server Made Big Boo"
在php-5.2.4 中添加了类似,但不相同的功能如果被访问的php脚本包含语法错误,并且 display_errors = off,会立刻返回“HTTP/1.0 500 Internal Server Error”。
如果你需要设定一个 503错误,或者想要使这个行为独立于 display_errors 的设定,那幺可以使用fastcgi.error_header。如果你在php-5.2.5 或以上版本上启用 php-fpm,那幺fastcgi.error_header的优先权更高。
最佳化的上传支持
实质web server 支持
类型最佳化
这个特性正如名字那样,可以加速对大 POST 请求的处理速度,包括档案上传。最佳化是通过将请求体已写入一个临时档案,然后fastcgi协定传递档案名称而不是请求体到来实现的。只有 nginx0.5.9 以上才支持这个功能。显然,这种模式只在php和 web server 在一台机器上的时候才能用。
nginx 样例配置
location ~ \.php$ {
fastcgi_pass_request_body off;
client_body_in_file_only clean;
fastcgi_param REQUEST_BODY_FILE $request_body_file;
...
fastcgi_pass ...;
}
在php中不需要配置任何东西。如果php收到了参数REQUEST_BODY_FILE,就读取其中的请求体,如果没有,就自行从fastcgi协定中读取请求体。
结合这个特性,可以考虑对临时档案使用记忆体档案系统,例如tmpfs(linux)
client_body_temp_path /dev/shm/client_body_temp;
fastcgi_finish_request()
範围php函式
类型最佳化
这个特性可以提高一些php请求的处理速度。如果有些处理可以在页面生成完后进行,就可以使用这种最佳化。比如,在 memcached 中保存 session 就可以在页面交给 web server 后进行。fastcgi_finisth_request() ,这一特性可以结束回响输出,web server 可以立即开始交给等不及的客户端,而此刻,php可以在请求的上下文环境中处理许多事情。比如保存session,转换上传的视频,处理统计等等。
fastcgi_finish_request() 会触发 shutdown 函式运行。
request_slowlog_timeout
範围:php-fpm.conf 选项
分类: 方便
这个选项能让你跟蹤执行缓慢的脚本并把他们连同调用栈一起记录在日誌档案中。例如如下设定
<value name="request_slowlog_timeout">5s</value>
<value name="slowlog">logs/slow.log</value>
正如你再例子中看到的,脚本运行了 5 秒以上,并很可能是由于 mysql 回响慢造成的(top backtrace)。
FAQ
Qphp-fpm 可以和 ZendOptimize 一起用吗?
A完全可以。
Qphp-fpm 可以和 ZendPlatform、xcache、eAccelerator、APC 等的最佳化器一起用吗?
A是的。php-fpm 的架构和任何一种用于高速 opcode 快取的共享记忆体都适用。唯一的限制是所有的 worker 进程只能适用一个快取,即使它们用不同的 uid/gid 运行
Q为什幺我要给php打补丁呢?spawn-fcgi 不需要这样!
Aphp-fpm 的创建是为了增强方便管理。没有打过补丁的php不能做到
平滑重启php而不丢失请求,包括升级 php二进制档案以及/或者 扩展。
用不同的 uid / gid / chroot 环境运行 worker 进程
所有的设定只有一个配置档案
根据负载动态请求 (TODO)
对php请求实时统计性能 (TODO)
Q为什幺要用 root 运行php-fpm 呢?这安全吗?
A用 root 启动php-fpm 只有在你打算用不同 uid/gid 的 php 来处理请求时才有意义。比如,在共享主机上的不同站点。因为只有在 master 进程用 root 运行的时候,才可以建立不同 uid/gid 的子进程。这是相当安全的。master 进程自己从来不会去处理请求。
在任何情况下,php-fpm 都不会用 root 身份来处理请求。
Qphp-fpm 可以加速 php 脚本处理速度吗?
A不,它不会影响处理速度。不过,如果你使用一些特殊特性,对于一些特定的请求还是可以有性能提升的。
Q如果我把我的网站从 mod_php迁移到php-fpm ,我会得到性能提升吗?
A通常,当有伺服器上有大量空闲记忆体可用时,能从迁移到 php-fpm 中得到的性能提升可能不大。如果记忆体并不充裕,性能提升还是很可观的,在某些情况下可以达到 300-500%。这可能是由于 nginx +php-fpm 一般会比 Apache + mod_php 使用更少的记忆体。而且 VFS 快取会由于更多的空余记忆体而更有效地工作。
Qphp-fpm 将来会被官方的 php 包含吗?
A我希望如此。php-fpm 代码採用的是GPL许可证 。所以现在php-fpm 的代码与 php 协定(类似BSD许可证)并不匹配。这是临时性措施。这样的选择是为了简化开发过程。一旦代码的功能完备,比如自适应生成子进程和其他一些东西,协定会改为一个相匹配的。之后,php-fpm 会正式发布给 php 开发团队,并被建议包含。
文档
php-fpm 已经在 Linux、MacOSX、Solaris 和 FreeBSD 上测试通过。
确信 libxml2(在某些系统上叫做libxml2-devel)已经安装。
下载最小的 php 和php-fpm
$ bzip2 -cdphp-5.2.5.——tar.——bz2 | tar xf -
$ gzip -cdphp-5.2.5-fpm-0.5.7.diff.gz | patch -d php-5.2.5 -p1
$ cdphp-5.2.5 && ./configure --enable-fastcgi--enable-fpm
$ make all install
编辑 $prefix/etc/php-fpm.conf
运行 $prefix/bin/php-cgi --fpm
仔细检查 $prefix/logs/php-fpm.log
运行phpinfo() 检查你的网站是否还正常运行
master 进程的 pid 被存放在 $prefix/logs/php-fpm.pid
master进程可以理解以下信号
SIGINT, SIGTERM | 立刻终止 |
SIGQUIT | 平滑终止 |
SIGUSR1 | 重新打开日誌档案 |
SIGUSR2 | 平滑重载所有worker进程并重新载入配置和二进制模 |
关于
我的名字叫 Andrei Nigmatulin, 我是php-fpm 的作者。
从 2004 年开始,我就在等有什幺人让 PHP FastCGI 能满足产品环境,但我等不下去了。
php-fpm 是在数个项目中使用 PHP 的 FastCGI SAPI 中的知识、经验和想法的产物。
php-fpm 可以在 GPL 协定下用在公共用途。和 php-fpm 绑定的修改版的libevent是在 BSD 协定下发布的。
我需要得到您的反馈——新的想法和建议——来改进和最佳化phpFastCGI SAPI。 如果您有什幺想法、意见、补充和建议,我会很高兴,很愿意听取,也许还会实现他们。给给我发邮件吧。(地址在本页的末尾)。
如果你想支持php-fpm 的开发,可以作一些捐赠 Paypal Yandex.Money
译注
php-fpm还带有一个更方便的脚本,在$prefix/sbin/php-fpm。可以用php-fpm start|graceful|restart|stop来维护。稍编辑一下就可以让它使用配置档案。