PHP-FPM实现性能优化


Posted in PHP onMarch 31, 2016

简介:

PHP-FPM 是一个 PHP FastCGI 管理器,一般 Nginx 上面跑 PHP 程序都会将 PHP 程序丢给 PHP-FPM 来解析。好了,就这样!

PHP 5.4 开始集成了 PHP-FPM ,也就是说编译 PHP 时,只要 --enable-fpm 就装好了 PHP-FPM 。

一、安装 PHP-FPM

shell > ./configure --prefix=/usr/local/php \
--with-config-file-path=/usr/local/php --with-mysql=/usr/local/mysql/ \
--with-mysqli=/usr/local/mysql/bin/mysql_config --with-gd --with-xsl --with-bz2 \
--with-zlib --with-curl --with-pear --without-iconv --with-mcrypt \
--with-gettext --with-openssl --with-libxml-dir --with-png-dir --with-jpeg-dir --with-freetype-dir \
--with-libdir=lib64 --enable-ftp --enable-fpm --enable-opcache --enable-exif --enable-soap --enable-bcmath --enable-calendar \
--enable-sockets --enable-mbstring --enable-gd-native-ttf --disable-rpath --disable-debug

## 看到上面这堆参数了没有,这是在编译 PHP ,其中有一个参数是 --enable-fpm 没错,这就是启用 PHP-FPM 扩展。

shell > make; make install

二、配置 PHP-FPM

shell > cp /usr/local/src/php-5.6.17/php.ini-production /usr/local/php/php.ini # 这是 PHP 的配置文件
shell > cp /usr/local/src/php-5.6.17/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm # 这是 PHP-FPM 的启动脚本
shell > cd /usr/local/php/etc/
shell > cp php-fpm.conf.default php-fpm.conf # 复制一份配置文件
shell > vim php-fpm.conf

[global]

pid = run/php-fpm.pid # PID
rlimit_files = 65535 # 打开文件数限制

[www] # 进程池

user = nginx # 以 nginx 身份运行
group = nginx

listen = 127.0.0.1:9000 # 监听本机的 9000 端口

;listen = /dev/shm/php-cgi.sock; # 监听 UNIX SOCKET ,并把 SOCKET 放在了内存空间中,速度更快 ( Nginx 也要相应修改 )!
;listen.backlog = 10240 # UNIX SOCKET 的方式高并发下有点不稳定,该参数用来缓解 ( SOCKET 等待队列长度 )

;listen.owner = nginx # UNIX SOCKET 的权限
;listen.group = nginx
;listen.mode = 0660

pm = dynamic # 创建进程的方式,动态创建
pm.max_children = 32 # 最大进程数 ( 不能只看内存来创建,要看具体使用率,有时内存足够,进程数大多时,导致 CPU 频繁上下文切换,负载会很高 )
pm.start_servers = 5 # 初始进程数
pm.min_spare_servers = 5 # 最小空闲进程数
pm.max_spare_servers = 10 # 最大空闲进程数

pm.status_path = /php_status # PHP-FPM 状态监控 ( Nginx 要设置访问权限 )

shell > service php-fpm start

三、监控 PHP-FPM

shell > vim /usr/local/nginx/conf/nginx.conf

location ~ /php_status { # 创建一个单独的 server 或直接在 server {} 中加入配置

  access_log off;

  allow 127.0.0.1;
  allow 36.110.41.194; # 做好权限
  deny all;

  fastcgi_pass 127.0.0.1:9000; # 如果是 UNIX SOCKET 的方式,要类似这样写: fastcgi_pass unix:/dev/shm/php-cgi.sock;
  fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
  include fastcgi_params;
}

shell > kill -HUP `cat /usr/local/nginx/logs/nginx.pid`

shell > curl http://127.0.0.1/php_status # 访问该路径得到如下数据
pool: www               # 进程池名称
process manager: dynamic        # 进程管理方式
start time: 22/Jan/2016:15:49:00 +0800 # 启动时间
start since: 375            # 运行时长
accepted conn: 7            # 当前进程池接受的请求数
listen queue: 0            # 请求等待队列,如果不为 0 ,意味着 FPM 进程不足,需要增加
max listen queue: 0          # 最大等待队列数量
listen queue len: 1024         # SOCKET 等待队列长度
idle processes: 4           # 空闲进程数
active processes: 1          # 活跃的进程数
total processes: 5           # 总进程数
max active processes: 1        # 最大活跃进程数
max children reached: 0        # 达到最大进程数的次数,如果不为 0 ,意味着最大进程数不足,需要增加
slow requests: 0            # 慢请求数量,需要设置 slow log

shell > curl http://127.0.0.1/php_status # 这里有多种参数供选择,例如: http://127.0.0.1/php_status?html 、?json 、?xml 、?full

# 我想,用 python 脚本用做个监控,?json 格式是最好不过了吧!

PHP 相关文章推荐
PHP中的正规表达式(一)
Oct 09 PHP
php使用ereg验证文件上传的方法
Dec 16 PHP
大家在抢红包,程序员在研究红包算法
Aug 31 PHP
WordPress中用于创建以及获取侧边栏的PHP函数讲解
Dec 29 PHP
Zend Framework实现多文件上传功能实例
Mar 21 PHP
Laravel路由设定和子路由设定实例分析
Mar 30 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
May 20 PHP
php字符串操作常见问题小结
Oct 11 PHP
PHP实现微信退款功能
Oct 02 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
Oct 23 PHP
PHP实现提取多维数组指定一列的方法总结
Dec 04 PHP
WordPress伪静态规则设置代码实例
Dec 10 PHP
PHP实现通过URL提取根域名
Mar 31 #PHP
PHP的PDO操作简单示例
Mar 30 #PHP
PHP Smarty模版简单使用方法
Mar 30 #PHP
PHP格式化MYSQL返回float类型的方法
Mar 30 #PHP
PHP获取网页所有连接的方法(附demo源码下载)
Mar 30 #PHP
PHP记录页面停留时间的方法
Mar 30 #PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
Mar 30 #PHP
You might like
不错的一篇面向对象的PHP开发模式(简写版)
2007/03/15 PHP
php 页面执行时间计算代码
2008/12/04 PHP
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
2011/12/05 PHP
解析thinkphp的左右值无限分类
2013/06/20 PHP
PHP命令行脚本接收传入参数的三种方式
2014/08/20 PHP
PHP数组操作――获取数组最后一个值的方法
2015/04/14 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
2017/03/04 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
js 图片轮播(5张图片)
2008/12/30 Javascript
js getBoundingClientRect() 来获取页面元素的位置
2010/11/25 Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
2015/11/05 Javascript
漂亮! js实现颜色渐变效果
2016/08/12 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
详解tween.js的使用教程
2017/09/14 Javascript
jQuery响应滚动条事件功能示例
2017/10/14 jQuery
Bootstrap的aria-label和aria-labelledby属性实例详解
2018/11/02 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
小程序input数据双向绑定实现方法
2019/10/17 Javascript
JQuery获得内容和属性方法解析
2020/05/30 jQuery
javascript实现拼图游戏
2021/01/29 Javascript
[01:03:03]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
你所不知道的Python奇技淫巧13招【实用】
2016/12/14 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
Python实现的txt文件去重功能示例
2018/07/07 Python
python openCV获取人脸部分并存储功能
2019/08/28 Python
Python input函数使用实例解析
2019/11/22 Python
最好的意大利皮夹克:D’Arienzo
2018/12/04 全球购物
俄罗斯在线大型超市:ТутПросто
2021/01/08 全球购物
给物业的表扬信
2014/01/21 职场文书
公司经理聘任书
2014/03/29 职场文书
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
乡镇保密工作承诺书
2015/05/04 职场文书
新闻发布会新闻稿
2015/07/17 职场文书
导游词之四川熊猫基地
2020/01/13 职场文书
Python基础之条件语句详解
2021/06/16 Python