“Php性能优化”的版本间的差异

来自linux中国网wiki
跳到导航 跳到搜索
(导入1个版本)
第122行: 第122行:
 
=[PHP] - 性能加速 - 开启Opcache=
 
=[PHP] - 性能加速 - 开启Opcache=
 
<pre>
 
<pre>
 +
 +
PHP 5.5 以后内建了 OpCache , OpCache 的加速原理是把编译后的 bytecode 存储在内存里面,避免重复编译 PHP 所造成的资源浪费.
 +
 
打开php.ini文件
 
打开php.ini文件
  
 
2. 找到:[opcache],设置为:
 
2. 找到:[opcache],设置为:
 +
 +
添加opcache.so
 +
在php.ini最后一行添加opcache.so 主要作用是用来引用opcache
 +
  
 
[opcache]
 
[opcache]
 +
 +
; so地址
 +
zend_extension=opcache.so
 
; 开关打开
 
; 开关打开
 
opcache.enable=1
 
opcache.enable=1
 
+
; 开启CLI
; 设置共享内存大小, 单位为:Mb
+
opcache.enable_cli=1
 +
; 设置共享内存大小, 单位为:Mb ; 可用内存, 酌情而定, 单位为:Mb
 
opcache.memory_consumption=128
 
opcache.memory_consumption=128
  
第138行: 第149行:
 
#提示:在opcache使用软连接的情况下,会存在opcache没有被清除的情况.可以使用重启fastcgi来解决这个问题.
 
#提示:在opcache使用软连接的情况下,会存在opcache没有被清除的情况.可以使用重启fastcgi来解决这个问题.
  
添加opcache.so
+
; Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB)
在php.ini最后一行添加opcache.so 主要作用是用来引用opcache
+
opcache.interned_strings_buffer=8
 +
; 对多缓存文件限制, 命中率不到 100% 的话, 可以试着提高这个值
 +
opcache.max_accelerated_files=10000
 +
; Opcache 会在一定时间内去检查文件的修改时间, 这里设置检查的时间周期, 默认为 2, 定位为秒
 +
opcache.revalidate_freq=1
 +
; 打开快速关闭, 打开这个在PHP Request Shutdown的时候回收内存的速度会提高
 +
opcache.fast_shutdown=1
  
 
[root@abcdocker ~]# tail /etc/php.ini  
 
[root@abcdocker ~]# tail /etc/php.ini  
 
zend_extension="opcache.so"
 
zend_extension="opcache.so"
 
</pre>
 
</pre>
 +
 +
 +
[https://learnku.com/laravel/t/301/using-opcache-to-enhance-the-performance-of-the-php-55-program  使用 OpCache 提升 PHP 5.5+ 程序性能 ]
 +
 +
[https://www.cnblogs.com/HD/p/4554455.html [PHP<nowiki>]</nowiki> - 性能加速 - 开启opcache]
 +
 +
[https://www.cnblogs.com/sgm4231/p/10189744.html OPcache及php语法检查]
 +
 
=php-fpm.conf=
 
=php-fpm.conf=
 
PHP-CGI-->php-fpm  
 
PHP-CGI-->php-fpm  

2020年4月1日 (三) 05:57的版本

pre check


看当前php-fpm进程的内存占用情况及启动时间,命令如下:

ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'|grep www|sort -nrk5

从下图可以看出当前php-fpm所有进程平均每个进程占用了60-70MB的内存,启动时间

少安装不要的PHP模块

kernel

这个kernel 独立出来吧

#dkm/dkmops/osinit/init.sh
#dkm/init/init.sh

fs.file-max = 6553500
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.eth1.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.eth0.secure_redirects = 1
net.ipv4.conf.eth1.secure_redirects = 1
net.ipv4.conf.lo.secure_redirects = 1
net.ipv4.conf.default.secure_redirects = 1
net.ipv4.conf.all.secure_redirects = 1
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth1.accept_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth1.send_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 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.core.wmem_max = 8388608
net.core.rmem_max = 8388608
net.ipv4.tcp_rmem = "4096 873814 8738140"
net.ipv4.tcp_wmem = "4096 873814 8738140"
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1

[[ ! -f /etc/security/limits.d/nofile.conf ]] && echo "*               -       nofile          8192"    >> /etc/security/limits.d/nofile.conf


2.调高linux内核打开文件数量,可以使用这些命令(必须是root帐号)(我是修改/etc/rc.local,加入ulimit -SHn 51200的)
echo `ulimit -HSn 65536` >> /etc/profile
echo `ulimit -HSn 65536` >> /etc/rc.local
source /etc/profile 

如果`ulimit -n`数量依旧不多(即上面配置没生效)的话, 可以在 /etc/security/limits.conf 文件最后加上

* soft nofile 51200
* hard nofile 51200





体结构方面优化PHP性能

1.将PHP升级到最新版

  提高性能的最简单的方式是不断升级、更新PHP版本。

2.使用分析器

  网站运行缓慢的原因颇多,Web应用程序极其复杂,让人扑朔迷离。而一种可能性在于PHP代码本身。这个分析器可以帮助你快速找出造成瓶颈的代码,提高网站运行的总体性能。

  Xdebug PHP extension提供了强大的功能,可以用来调试,也可以用来分析代码。方便开发人员直接跟踪脚本的执行,实时查看综合数据。还可以将这个数据导入到可视化的工具 KCachegrind中

5.PHP缓存,使用PHP加速器:APC  如下的 开启Opcache

  一般情况下,PHP脚本被PHP引擎编译后执行,会被转换成机器语言,也称为操作码。如果PHP脚本经过反复编译而得到相同的结果,那为什么不完全跳过编译过程呢?

  通过PHP加速器,你完全可以实现这一点,它缓存了PHP脚本编译后的机器码,允许代码根据要求立即执行,而不经过繁琐的编译过程


6.内存缓存 

  PHP通常在检索和数据分析方面扮演着重要角色,这些操作可能会导致性能降低。实际上有些操作是完全没有必要的,特别是从数据库中反复检索一些常用的静态数据。不妨考虑一下短期使用 Memcached extension来缓存数据。Memcached的扩展缓存与libMemcached库协同工作,在RAM中缓存数据,也允许用户定义缓存的期限,有助于确保用户信息的实时更新。

 

7.内容压缩:

     几乎所有的浏览器都支持Gzip的压缩方式,gzip可以降低80%的输出,付出的代价是大概增加了10%的cpu计算量。但是赚到的是不仅占用的带宽减少了,而且你的页面加载会变得很快,优化了你的PHP站点性能。
 你可以在PHP.ini中开启它
 zlib.output_compression = On
 zlib.output_compression_level = (level)(level可能是1-9之间的数字,你可以设置不同的数字使得他适合你的站点。)
 如果你使用apache,你也可以激活mod_gzip模块,他是高度可定制的。

 

8.服务器缓存:

     主要是基于web反向代理的静态服务器nginx和squid,还有apache2的mod_proxy和mod_cache模块

 

9.数据库优化:数据库缓存等

        通过配置数据库缓存,如开启QueryCache缓存,当查询接收到一个和之前同样的查询, 服务器将会从查询缓存种检索结果,而不是再次分析和执行上次的查询
        以及数据存储过程,连接池技术等。

[PHP] - 性能加速 - 开启Opcache


PHP 5.5 以后内建了 OpCache , OpCache 的加速原理是把编译后的 bytecode 存储在内存里面,避免重复编译 PHP 所造成的资源浪费.

打开php.ini文件

2. 找到:[opcache],设置为:

添加opcache.so
在php.ini最后一行添加opcache.so 主要作用是用来引用opcache


[opcache]

; so地址
zend_extension=opcache.so
; 开关打开
opcache.enable=1
; 开启CLI
opcache.enable_cli=1
; 设置共享内存大小, 单位为:Mb ; 可用内存, 酌情而定, 单位为:Mb
opcache.memory_consumption=128

;如果启用,那么 OPcache 会每隔 opcache.revalidate_freq 设定的秒数 检查脚本是否更新。 如果禁用此选项,你必须使用 opcache_reset() 或者 opcache_invalidate() 函数来手动重置 OPcache,也可以 通过重启 Web 服务器来使文件系统更改生效。
opcache.validate_timestamps=60

#提示:在opcache使用软连接的情况下,会存在opcache没有被清除的情况.可以使用重启fastcgi来解决这个问题.

; Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB)
opcache.interned_strings_buffer=8
; 对多缓存文件限制, 命中率不到 100% 的话, 可以试着提高这个值
opcache.max_accelerated_files=10000
; Opcache 会在一定时间内去检查文件的修改时间, 这里设置检查的时间周期, 默认为 2, 定位为秒
opcache.revalidate_freq=1
; 打开快速关闭, 打开这个在PHP Request Shutdown的时候回收内存的速度会提高
opcache.fast_shutdown=1

[root@abcdocker ~]# tail /etc/php.ini 
zend_extension="opcache.so"


使用 OpCache 提升 PHP 5.5+ 程序性能

[PHP] - 性能加速 - 开启opcache

OPcache及php语法检查

php-fpm.conf

PHP-CGI-->php-fpm

max_children

pm = static/dynamic,标识fpm子进程的产生模式
static(静态) :表示在fpm运行时直接fork出pm.max_chindren个worker进程
dynamic(动态):表示运行时fork出start_servers个进程,随着负载的情况,动态的调整,最多不超过max_children个进程。这个在自己的VPS
生产一般推荐用static,优点是不用动态的判断负载情况,提升性能,缺点是多占用些系统内存资源。

max_children这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。
设置”max_children”也需要根据服务器的性能进行设定
一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右
假设“max_children”设置成100个,20M*100=2000M 也就是说在峰值的时候所有PHP-CGI所耗内存在2000M以内。

如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误

pm.start_servers的默认值为2。并且php-fpm中给的计算方式也为:{(cpu空闲时等待连接的php的最小子进程数) + (cpu空闲时等待连接的php的最大子进程数 - cpu空闲时等待连接的php的最小子进程数)/ 2};

用配置表示就是:min_spare_servers + (max_spare_servers - min_spare_servers) / 2;一般而言,设置成10-20之间的数据足够满足需求了

最大请求数max_requests

我一般是500
最大处理请求数是指一个php-fpm的worker进程在处理多少个请求后就终止掉,master进程会重新respawn一个新的。

这个配置的主要目的是避免php解释器或程序引用的第三方库造成的内存泄露

502,是后端 PHP-FPM 不可用造成的,间歇性的502一般认为是由于 PHP-FPM 进程重启造成的.但是为什么要重启进程呢?如果不定期重启 PHP-CGI 进程,势必造成内存使用量不断增长(比如第三方库有问题等)。因此 PHP-FPM 作为 PHP-CGI 的管理器,提供了这么一项监控功能,对请求达到指定次数的 PHP-CGI 进程进行重启,保证内存使用量不增长。正是因为这个机制,在高并发中,经常导致 502 错误目前我们解决方案是把这个值尽量设置大些,减少 PHP-CGI 重新 SPAWN 的次数,同时也能提高总体性能。PS:刚开始我们是500导致内存飙高,现在改成5120,当然可以再大一些,10240等,这个主要看测试结果,如果没有内存泄漏等问题,可以再大一些

最长执行时间request_terminate_timeout


max_execution_time和request_terminate_timeout; The timeout for serving a single request after which the worker process will; be killed. This option should be used when the ‘max_execution_time’ ini option; does not stop script execution for some reason. A value of ‘0’ means ‘off’.; Available units: s(econds)(default), m(inutes), h(ours), or d(ays); Default Value: 0;request_terminate_timeout = 0============设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的’max_execution_time’因为某些特殊原因没有中止运行的脚本有用. 设置为 ‘0’ 表示 ‘Off’.当经常出现502错误时可以尝试更改此选项。这两项都是用来配置一个PHP脚本的最大执行时间的。当超过这个时间时,PHP-FPM不只会终止脚本的执行,还会终止执行脚本的Worker进程。Nginx会发现与自己通信的连接断掉了,就会返回给客户端502错误


request_slowlog_timeout = 10

php-fpm nginx 优化


PHP-FPM设置max_chindren、max_requests

慢查询

我们有时候会经常饱受500,502问题困扰。当nginx收到如上错误码时,可以确定后端php-fpm解析php出了某种问题,比如,执行错误,执行超时。

这个时候,我们是可以开启慢日志功能的。

    slowlog = /var/log/php-fpm.log.slow
    request_slowlog_timeout = 15s

当一个请求该设置的超时时间15秒后,就会将对应的PHP调用堆栈信息完整写入到慢日志中。

php-fpm慢日志会记录下进程号,脚本名称,具体哪个文件哪行代码的哪个函数执行时间过长:

    [21-Nov-2013 14:30:38] [pool www] pid 11877
    script_filename = /usr/local/lnmp/nginx/html/www.quancha.cn/www/fyzb.php
    [0xb70fb88c] file_get_contents() /usr/local/lnmp/nginx/html/www.quancha.cn/www/fyzb.php:2

通过日志,我们就可以知道第2行的file_get_contents 函数有点问题,这样我们就能追踪问题了

一般来说

对于大内存以及对并发和可用性要求的话,建议使用static管理模式+最大的pm.max_children

问题哦php-fpm.conf max_children 和 max_requests怎么配置



一天有20万PV,服务器是R420 双CPU 内存是16G怎么配置参数呀?php-fpm.conf max_children 和 max_requests怎么配置
还有nginx.conf中的最大连接数最佳配置是多少


答:

max_children是PHP-FPM Pool 最大的子进程数,他数值取决于你的服务器内存。 假设你打算给10G内存给当前配置的PHP-FPM Pool,一般一个PHP请求占用内存10M-40M,我们按站点每个PHP请求占用内存25M,这样max_children = 10G/25M = 409。所以,这个值可以根据情况算出来

max_requests是每个子进程重生之前处理的请求数, 默认值为unlimited(默认为1024),可以设置小一点(如500左右),这样可以避免内存泄露带来的问题

Nginx代理过程,将业务服务器请求数据缓存到本地文件,再将文件数据转发给请求客户端。高并发的客户端请求,必然要求服务器文件句柄的并发打开限制。使用ulimit命令(ulimit -n),查看Linux系统文件句柄并发限制,默认是1024,我们可以改为65535(2 的 16 次方,这是系统端口的极限)。修改的方法为:修改系统文件/etc/security/limits.conf,添加如下信息,并重新启动系统生效。

* soft   nofile  65535

* hard   nofile  65535

然后在Nginx配置文件中,把文件限制及连接数信息改为65535:

worker_rlimit_nofile 65535;
events {
    use epoll;
    worker_connections  65535;
}




php.ini

see also

Linux的php-fpm优化心得-php-fpm进程占用内存大和不释放内存问题


php-fpm的配置和优化

Nginx+PHP-FPM优化技巧总结

php-fpm的配置和优化

php-fpm安装、配置与优化

php.net/manual/zh/install.fpm.configuration.php


PHP-php-fpm配置优化

PHP的pm、pm.max_requests、memory_limit参数优化说明

Setting Up FastCGI Proxying官方

php代码的优化和结构方面优化PHP性能

PHP 开发优化


PHP性能加速开启Opcache