php性能优化配置

1.php.ini之opcache配置php

opcache.enable=1;//开启opcache缓存php操做码提升运行效率
opcache.memory_consumption=64;//为操做码缓存分配的内存大小,视脚本的数量而定
opcache.interned_strings_buffer=16;//用来存储驻留字符串的内存量,默认状况PHP解释器会从各个PHP进程中找到相同字符串的指针,若是存在则使用已有的字符串指针。开启该项配置能够从各个进程中集中到共享的缓冲区,以节省更多内存。
opcache.max_accelerated_files=32531;//OPcache 哈希表中可存储的脚本文件数量上限,应大于项目脚本文件数
opcache.validate_timestamps=0;//是否检测脚本内容发生变化,生产环境建议设置为0(PS:每次更新代码记得手动重置下缓存 opcache_reset),开发环境设置为1.
opcache.revalidate_freq=0;//当opcache.validate_timestamps设置为0时该配置项没有任何意义。
opcache.fast_shutdown=1;//启用,则会使用快速中止续发事件。 所谓快速中止续发事件是指依赖 Zend 引擎的内存管理模块 一次释放所有请求变量的内存,而不是依次释放每个已分配的内存块。从 PHP 7.2.0 开始,此配置指令被移除。 快速中止的续发事件的处理已经集成到 PHP 中, 只要有可能,PHP 会自动处理这些续发事件。


14.15开启opcache负载从0.03降低到0.01html

a.清空opcachemysql

1.适合cli模式nginx

<?php
if(function_exists('opcache_reset')){
    opcache_reset();
}

2.适合php-fpm服务下的应用(更多信息见:http://gordalina.github.io/cachetool/)git

curl -sO http://gordalina.github.io/cachetool/downloads/cachetool.phar
chmod +x cachetool.phar
php cachetool.phar opcache:reset --fcgi=/dev/shm/php-fpm.socket

 

2.php-fpmgithub

[global]
pid = /tmp/php-fpm.pid
error_log = /data/logs/php/php-fpm.log
log_level = notice
emergency_restart_threshold = 60;在emergency_restart_interval设置的时间跨度内,若是失效的php-fpm子进程数超过这个值,php-fpm主进程就重启
emergency_restart_interval = 1m;设定emergency_restart_threshold设置采用的时间跨度
process_control_timeout = 10s;设置子进程接受主进程复用信号的超时时间。参考:https://segmentfault.com/q/1010000007053797
[www]
;能够记录日志方便找问题
;access.log = /data/logs/php/access.log
pm.status_path = /phpstatus
user = www
group = www
listen = /dev/shm/php-fpm.socket
listen.mode = 0666
listen.owner = www
listen.group = www
listen.allowed_clients = 127.0.0.1
listen.backlog = 8096;//根据状况来配置默认是-1依据系统来分配。手动设置应是2的倍数
pm = dynamic;参考https://www.jianshu.com/p/c9a028c834ff dynamic适合内存比较少的状况
pm.max_children = 50
pm.start_servers = 25;=pm.min_spare_servers+(pm.max_spare_servers-pm.min_spare_servers)/2
pm.min_spare_servers = 20
pm.max_spare_servers = 30
pm.max_requests = 1024;若是你的请求流量很平均(按时间)会致使全部的子进程在短期内一块儿重启致使服务器性能波动和短暂的502,这样子能够建议不配置该参数,可是会一每天吃掉你的内存!
request_slowlog_timeout = 3
request_terminate_timeout = 300
catch_workers_output = yes
slowlog = /data/logs/php/php-fpm.log.slow
rlimit_files = 65535

pm.max_chindren详解:sql

pm.max_chindren,进程多了,增长进程管理的开销以及上下文切换的开销。更核心的是,能并发执行的 php-fpm 进程不会超过 cpu 个数。
如何设置,取决于你的代码
若是代码是 CPU 计算密集型的,pm.max_chindren 不能超过 CPU 的内核数。
若是不是,那么将 pm.max_chindren 的值大于 CPU 的内核数,是很是明智的。
国外技术大拿给出这么个公式:
在 N + 20% 和 M/m 之间。
N 是 CPU 内核数量。
M 是 PHP 能利用的内存数量。
m 是每一个 PHP 进程平均使用的内存数量。
适用于 dynamic 方式。
static方式:M/(m * 1.2)
固然,还有一种保险的方式,来配置 max_children。适用于 static 方式。
先把 max_childnren 设置成一个比较大的值。
稳定运行一段时间后,观察 php-fpm 的 status 里的 max
active processes 是多少
而后把 max_children 配置比它大一些就能够了。
pm.max_requests:指的是每一个子进程在处理了多少个请求数量以后就重启。

引用自http://xiaohost.com/2614.html

我的看法:pm.max_chindren=(可用内存-(mysql、nginx等其余核心服务所需的内存))/(每一个php进程所需内存*1.5)

3. php.ini之文件上传segmentfault

file_uploads =1
upload_max_filesize=10M;文件最大尺寸,改变该值记得验证nginx的client_max_body_size设置
max_file_uploads=3;单次请求最多3个文件

4.php.ini最长执行时间浏览器

max_execute_time=5;设置单个php进程在终止以前最长能够运行多少时间,建议不超过10s。长时间任务建议交给cli

5.php.ini之日志配置缓存

display_startup_errors=on;//生产环境Off
display_errors=On;生产环境Off
error_reporting=-1;报告全部错误 生产环境E_ALL & ~E_NOTICE
log_errors=On;记录错误

6.php.ini之处理会话

session.save_handler='memcached'
session.save_path='127.0.0.1:11211'

7.php.ini缓冲输出

output_buffering=4096;32位系统是4的倍数64位系统是8的倍数
implicit_flush=false

8.php.ini之真实路径缓存(使用了大量文件,增长PHP真实路径缓存的大小能获得更好的性能)

realpath_cache_size=64k;设置技巧先设置一个比较大的值256k而后在脚本结尾加上print_r(realpath_cache_size())获取真实大小

9.网络链接优化

经过ss -s的closed和timewait指标来看是否链接创建是否正常,若是数值较大能够考虑作如下修改

/proc/sys/net/core/somaxconn全链接上限

/proc/sys/net/ipv4/tcp_max_syn_backlog半链接上限

nginx的backlog

php-fpm的listen.backlog

如下是参考配置cat /etc/sysctl.conf

net.ipv4.neigh.default.gc_stale_time = 120
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time=1800
net.ipv4.tcp_max_syn_backlog=8192
net.netfilter.nf_conntrack_max = 655350
net.netfilter.nf_conntrack_tcp_timeout_established = 120

10.nginx的ssl优化,我的经验开启缓存能够减小大量ssl握手的时间

ssl on;
ssl_certificate lvtao.net.crt; #公钥
ssl_certificate_key lvtao.net.key;#私钥
ssl_session_cache shared:SSL:20m; #缓存池  缓存大小设置为 20M,大概能放下 80000 个会话
ssl_session_timeout  10m;  #缓存时间
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #只启用 TLS 系列协议
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE:!kEDH;#按照这个套件配置
#完整参考 ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-RC4-SHA:ECDHE-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:RC4-SHA:HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!CBC:!EDH:!kEDH:!PSK:!SRP:!kECDH;
ssl_prefer_server_ciphers on;
#可选 如下三行 启用 OCSP  可让浏览器更快的获取证书撤销状态
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/startssl_trust_chain.crt; 
#启用 HSTS 用于通知浏览器强制使用 https 通讯。要求浏览器对用户明文访问的Url重写成HTTPS,避免了始终强制302重定向的延时开销
add_header Strict-Transport-Security "max-age=31536000";