当前位置: 首页 > 后端技术 > PHP

记得一个PHP优化案例

时间:2023-03-29 21:27:22 PHP

网站架构简介:现在很多公司都使用lnmp或者lamp作为网站服务器架构。我们熟悉这两个网站的服务架构;基于nginx的性能非常好。对于Apache,现阶段很多公司都在逐步将Apache替换为nginx。毕竟nginx自带的高可用配置、反向代理等功能还是比较突出的。Lnmp网站服务器架构其实就是linx+nginx+mysql+php架构体系,架构安装就不多说了。接下来说说吧,让我遇到一个案例Case:有一天,后台同事说后台访问很慢,有时候会出现502错误。然后反馈给技术上级,然后找我处理(当时喝茶),这才知道我又有事做了。分析:然后直接去找那个同事,问是不是网络的问题。也找了其他同事去拜访,还是出现访问繁忙的问题。那时我才知道事情没那么简单。公司采用lnmp网站服务器架构,之前没有做太多的优化。接下来,我们需要优化网站的服务架构。一、案例分析。我们可以认为,由于访问速度慢,所以有时不能直接访问。以前还好,现在突然出问题了。肯定是我们的nginx和php没有响应造成的。原因可能是其他域名网站。这是由于用户连接数的巨大增加造成的。那么我们就可以找到问题的根源并加以解决和优化。然后靠自己的经验和百度解决问题。二、问题解决及过程分析1、Nginx优化:1、查看nginx日志,发现报错`$`cat`/usr/local/nginx/logs/error.log`|grep`error`没有发现错误,正常查看后台域名的access.logs$cat/var/log/access_nging.log|grep报错(这里没及时抓图,刷日志,本地截日志,定时删除)发现日志可以找到报错信息,有十几个502错误。发现了问题。二、问题分析及nginx优化1、是nginx打开文件数限制导致的。1)首先我们想到nginx的openfilebook可能的原因,将nginx的openfilesnumber增加到nginx的配置文件中,发现openfilesnumber为4096,不出所料,数量打开文件数没有调整到最佳,可能是这个原因造成的。我们需要把4096改成51200;saveandreloadnginxvim/usr/local/nginx/conf/nginx.confworker_rlimit_nofile51200;events{worker_connections51200;}servicenginxrelaod2),Linux系统文件限制我们更改了nginx的打开文件配置,它可能没有用。我们需要查看系统ulimit–n限制的打开文件数。我们可以看到系统打开文件数也是4096,接下来我们修改系统打开文件数,使配置永久化。进入配置文件vim/etc/security/limits.conf更改参数:softnofile65535hardnofile65535softnproc65535hardnproc65535注意:系统限制可以随意更改,只要大于打开文件数即可nginx的。3、nginx的fastcgi连接时间太短。一般nginx通过FastCGI接口响应php,所以fastcgi参数配置很重要。HTTP服务器每次遇到动态程序,都可以直接交给FastCGI进程执行,然后将得到的结果返回给浏览器服务器,很多php网页都使用了动态程序。所以fastcgi的配置也起到了至关重要的作用。所以这是优化的一个组成部分。进入nginx.conf配置文件vim/usr/local/nginx/conf/nginx.conf,将fastcgi的connect、send、read参数的时间修改为300,配置如下:reloadnginxservicenginxreload4,访问域名称测试。重新访问域名,发现网页已经加载。连续访问了几次,发现访问还是有点慢,虽然访问很稳定。至此,我们就可以将问题指向php,继续下一步的php优化。二、php优化:1、查看php日志首先我们需要先查看日志,就像nginx一样。tail-n100/usr/local/php/var/log/php-fpm.log在日志中,我们可以发现php日志中有一个警告WARNING:[poolwww]seemsbusy(youmayneedtoincreasepm.start_servers,orpm.min/max_spare_servers)从alarm的意思我们知道php中有一个alarm,告诉我们增加php,pm.start_servers,orpm.min/max_spare_servers的值。2.原因分析首先我们看到日志中只出现了这个警告,证明不是很严重。至于为什么会出现源码事务警告,接下来我们一起来分析一下。首先我们清楚地知道pm.start_servers、pm.min/max_spare_servers在PHP中的作用是什么。首先,为什么会出现这个警告。我先把之前的配置参数贴上去。下面我们来分析一下这几个参数的作用:参数分析:·pm=dynamic表示php启用的动态模式注意:php有两种工作模式:dynamic和static(静态),默认为动态模式。·pm.max_children表示静态下的最大线程数·pm.start_servers表示动态下启动时的线程数。动态工作模式下的最大空闲线程数:Static模式当工作模式设置为static时,只有pm.max_children项有效,表示php-fpm工作时保持的线程数。动态模式在动态模式下,与其相关的参数有pm.start_servers、pm.min_spare_servers、pm.max_spare_servers,分别代表开启的php进程数、最小进程数、最大进程数。模式对比:Static模式比较适合一些内存比较大的服务器,8G以上,因为对于内存比较大的服务器,设置成static会提高效率。动态模式适用于内存较小的机器,可以灵活分配进程,节省内存。可以让php自动增减进程数,但是动态创建回收进程也是对服务器的一种消耗。3.PHP参数优化首先我们要考虑的问题是,如何调试参数达到优化的目的,一般来说一个php-fpm进程一开始只占用3M左右的内存,但是会上升运行一段时间后为20M-40M,这是因为PHP程序在执行后或多或少会产生内存泄漏。所以按理说php的最大进程数大概是本地内存/40,因为我们还要考虑系统占用内存的情况,不能直接把处理的结果作为最大进程数,否则你会死翘翘。我的服务器有8G内存,按理说最大php进程数在200左右,所以我根据这个参数做了一些调整:使用静态模式,设置最大进程数在125-150之间,搞定完毕。重新加载phpservicephp-fpmrelod查看进程数:netstat-anpo|grepphp-fpm|wc-l`128`效果达到了4。结果,重新访问,发现访问php页面快多了。查看日志,没有告警,后台访问也很好。(一个php文件)-n参数表示你的压力测试总量-c参数表示你模拟服务器性能的并发用户数。就个人而言,我认为还可以。下面是模拟1000个用户访问10万次的结果。不过大家在自己做压测的时候,慢慢调大参数,测试一下自己网站的瓶颈。