简介
PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。
现在我们可以在最新的PHP 5.3.2的源码树里下载得到直接整合了PHP-FPM的分支,据说下个版本会融合进PHP的主分支去。相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而PHP-FPM则没有这种烦恼。
PHP5.3.3已经集成
php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP
进程管理方式,可以有效控制
内存和
进程、可以平滑
重载PHP配置,比spawn-fcgi具有更多优点,所以被PHP官方收录了。在./configure的时候带
–enable-fpm参数即可开启PHP-FPM。
使用PHP-FPM来控制PHP-CGI的FastCGI进程
--logrotate 重新启用log文件
特色功能
所有这些特性都是“不打断”的方式实现的。也就是说,如果你不使用它们,它们的存在不会影响
php的功能性——他们都是“透明”的。
Error header
分类:便利性
默认情况下,如果被访问的
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 样例配置:
client_body_in_file_only clean;
fastcgi_param REQUEST_BODY_FILE $request_body_file;
...
}
在
php中不需要配置任何东西。如果
php收到了参数REQUEST_BODY_FILE,就读取其中的请求体,如果没有,就自行从
fastcgi协议中读取请求体。
结合这个特性,可以考虑对
临时文件使用内存文件系统,例如tmpfs(linux):
client_body_temp_path /dev/shm/client_body_temp;
类型:优化
这个特性可以提高一些
php请求的处理速度。如果有些处理可以在页面生成完后进行,就可以使用这种优化。比如,在 memcached 中保存 session 就可以在页面交给 web server 后进行。
fastcgi_finisth_request()
,这一特性可以结束响应输出,web server 可以立即开始交给等不及的客户端,而此刻,
php可以在请求的上下文环境中处理许多事情。比如保存session,转换上传的视频,处理统计等等。
fastcgi_finisth_request() 会触发 shutdown 函数运行。
request_slowlog_timeout
分类: 方便
这个选项能让你跟踪执行缓慢的脚本并把他们连同调用栈一起记录再日志文件中。例如如下设置:
<value name="request_slowlog_timeout">5s</value>
<value name="slowlog">logs/slow.log</value>
正如你再例子中看到的,脚本运行了 5 秒以上,并很可能是由于 mysql 响应慢造成的(top backtrace)。
php-fpm(PHP-FPM是一个PHPFastCGI管理器),古老的榕树,5-wow.com