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 explode()函数用法、切分字符串
Oct 03 PHP
php获取用户IPv4或IPv6地址的代码
Nov 15 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
Jun 17 PHP
php中如何使对象可以像数组一样进行foreach循环
Aug 09 PHP
迅速确定php多维数组的深度的方法
Jan 07 PHP
PHP date函数常用时间处理方法
May 11 PHP
PHP响应post请求上传文件的方法
Dec 17 PHP
php使用preg_match()函数验证ip地址的方法
Jan 07 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 PHP
php快速导入大量数据的实例方法
Sep 23 PHP
ThinkPHP5&5.1实现验证码的生成、使用及点击刷新功能示例
Feb 07 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 读取Postgresql中的数组
2013/04/14 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
2014/06/05 PHP
PHP文件上传类实例详解
2016/04/08 PHP
PHP模糊查询的实现方法(推荐)
2016/09/06 PHP
PHP保留两位小数的几种方法
2019/07/24 PHP
SWFObject 2.1以上版本语法介绍
2010/07/10 Javascript
js 幻灯片的实现
2011/12/06 Javascript
jQuery对html元素取值与赋值的方法
2013/11/20 Javascript
让input框实现类似百度的搜索提示(基于jquery事件监听)
2014/01/31 Javascript
javascript组合使用构造函数模式和原型模式实例
2015/06/04 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
详解利用exif.js解决ios手机上传竖拍照片旋转90度问题
2016/11/04 Javascript
文件上传的几个示例分享【推荐】
2016/12/16 Javascript
Bootstrap CSS组件之大屏幕展播
2016/12/17 Javascript
html5 canvas 详细使用教程
2017/01/20 Javascript
jQuery源码分析之sizzle选择器详解
2017/02/13 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
electron-vue开发环境内存泄漏问题汇总
2019/10/10 Javascript
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
小小聊天室Python代码实现
2016/08/17 Python
详解Python3注释知识点
2019/02/19 Python
python多线程扫描端口(线程池)
2019/09/04 Python
基于Python实现扑克牌面试题
2019/12/11 Python
python3用urllib抓取贴吧邮箱和QQ实例
2020/03/10 Python
Python批量获取并保存手机号归属地和运营商的示例
2020/10/09 Python
图解CSS3制作圆环形进度条的实例教程
2016/05/26 HTML / CSS
Pandora西班牙官方商店:PandoraShop.es
2020/10/05 全球购物
施工人员岗位职责
2013/12/12 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
四风自我剖析材料思想汇报
2014/10/01 职场文书
幼儿园教师师德表现自我评价
2015/03/05 职场文书
python 机器学习的标准化、归一化、正则化、离散化和白化
2021/04/16 Python
python批量创建变量并赋值操作
2021/06/03 Python
Python的三个重要函数详解
2022/01/18 Python