PHP-FPM,加速文件上传和输出,分析PHP程序慢的瓶颈
2009-08-23 02:15
761 查看
PHP-FPM,加速文件上传和输出,分析PHP程序慢的瓶颈
所有这些特性都是“不打断”的方式实现的。也就是说,如果你不使用它们,它们的存在不会影响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 中添加一条
在 php-5.2.4 中添加了类似,但不相同的功能:如果被访问的php脚本包含语法错误,并且
如果你需要设定一个 503 错误,或者想要使这个行为独立于 display_errors 的设置,那么可以使用
类型:优化
这个特性正如名字那样,可以加速对大 POST 请求的处理速度,包括文件上传。优化是通过将请求体已写入一个临时文件,然后 fastcgi 协议传递文件名而不是请求体到来实现的。目前就我所知,只有 nginx0.5.9 以上才支持这个功能。显然,这种模式只在 php 和 web server 在一台机器上的时候才能用。
nginx 样例配置:
在 php 中不需要配置任何东西。如果 php 收到了参数
结合这个特性,可以考虑对临时文件使用内存文件系统,例如tmpfs(linux):
client_body_temp_path /dev/shm/client_body_temp;
Category: Convenience
这个特性可以提高一些 php 请求的处理速度。如果有些处理可以在页面生成完后进行,就可以使用这种优化。比如,在 memcached 中保存 session 就可以在页面交给 web server 后进行。fastcgi_finisth_request() ,这一特性可以结束响应输出,web server 可以立即开始交给等不及的客户端,而此刻,php 可以在请求的上下文环境中处理许多事情。比如保存session,转换上传的视频,处理统计等等。
fastcgi_finisth_request() 会触发 shutdown 函数运行。
分类: 方便
这个选项能让你跟踪执行缓慢的脚本并把他们连同调用栈一起记录再日志文件中。例如如下设置:
记录的 slow.log 可能是这个样子:
同时,在 error.log 中保存了如下记录:
正如你再例子中看到的,脚本运行了 5 秒以上,并很可能是由于 mysql 响应慢造成的(top backtrace)。
所有这些特性都是“不打断”的方式实现的。也就是说,如果你不使用它们,它们的存在不会影响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()
Scope: directive php-fpm.confCategory: Convenience
这个特性可以提高一些 php 请求的处理速度。如果有些处理可以在页面生成完后进行,就可以使用这种优化。比如,在 memcached 中保存 session 就可以在页面交给 web server 后进行。fastcgi_finisth_request() ,这一特性可以结束响应输出,web server 可以立即开始交给等不及的客户端,而此刻,php 可以在请求的上下文环境中处理许多事情。比如保存session,转换上传的视频,处理统计等等。
fastcgi_finisth_request() 会触发 shutdown 函数运行。
request_slowlog_timeout
范围: php-fpm.conf 选项分类: 方便
这个选项能让你跟踪执行缓慢的脚本并把他们连同调用栈一起记录再日志文件中。例如如下设置:
<value name="request_slowlog_timeout">5s</value> <value name="slowlog">logs/slow.log</value>
记录的 slow.log 可能是这个样子:
Sep 21 16:22:19.399162 pid 29715 (pool default) script_filename = /local/www/stable/www/catalogue.php [0x00007fff23618120] mysql_query() /srv/stable/common/Database/class.MySQLRequest.php:20 [0x00007fff23618560] getResult() /srv/stable/common/Database/class.Facade.php:106 [0x00007fff23618aa0] query() /srv/stable/common/mysite.com/ORM/class.UsersMapper.php:99 [0x00007fff23618d60] resolveByID() /srv/stable/common/mysite.com/ORM/class.User.php:629 [0x00007fff236193b0] getData() /srv/stable/common/class.DataEntity.php:90 [0x00007fff236195d0] load() /srv/stable/common/mysite.com/ORM/class.User.php:587 [0x00007fff23619a00] getIsHidden() /srv/stable/common/mysite.com/class.User.php:42 [0x00007fff2361a470] getName() /local/www/stable/www/catalogue.php:41
同时,在 error.log 中保存了如下记录:
Sep 21 16:22:19.399031 [WARNING] fpm_request_check_timed_out(), line 135: child 29715, script '/local/www/stable/www/catalogue.php' (pool default) executing too slow (5.018002 sec), logging
正如你再例子中看到的,脚本运行了 5 秒以上,并很可能是由于 mysql 响应慢造成的(top backtrace)。
相关文章推荐
- NGINX-PHP-FPM-配置-最大上传文件
- 小程序的图片上传wx.uploadFile及后台PHP接收文件并存储到服务器
- php Ajax 文件上传实例分析
- php 实现多文件上传程序代码
- PHP文件上传原理简单分析
- PHP程序加速探索之压缩输出gzip
- PHP文件上传源码分析(RFC1867)
- 给初学者提供的PHP文件上传小程序
- 利用Xdebug分析PHP程序,找出性能瓶颈
- 疑难杂症:PHP程序无法上传文件
- PHP 文件上传实现及漏洞分析
- PHP程序加速探索[7]--压缩输出 gzip
- php-fpm nginx修改上传文件大小限制
- nginx php上传大文件的设置(php-fpm)
- 微信小程序常见问题->上传文件后如何在后台(php)获取文件名解决方法
- nginx+php-fpm 上传大文件报502 Bad Gateway
- CI框架源码完全分析之核心文件(输出类)Output.php
- 利用Xdebug和WinCacheGrind分析PHP程序,找出性能瓶颈
- 微信小程序常见问题->上传文件后如何在后台(php)获取文件名解决方法
- CI框架源码完全分析之核心文件(输出类)Output.php