PHP网站访问慢,我们应该如何处理?

如果你们公司的业务是用php语言开发的,那么使用的环境十有八九就是LNMP,在日常的运维工作中,占到9成以上的故障是遇到性能问题 。
你可能会想,我们的业务运行的好好的,为啥平白无故就出现性能问题?原因有太多可能,比如代码改动、异常访问、网络波动、服务器硬件故障等等 。
引起性能问题的原因有这么多,那如何定位呢?本章就来给大家介绍一个性能追踪的方法,这个方法在我运维职业生涯里屡试不爽,帮了我不少大忙 。

PHP网站访问慢,我们应该如何处理?

文章插图
 
< 1 > PHP-FPM的slow log
如果你所运维的网站或者应用为PHP的,那我相信你一定对LAMP或者LNMP不陌生 。我主张使用LNMP,原因无他,就一点 -- 我们可以通过slow log很方便地追踪到问题点 。先来看配置方法吧 。
1)编辑配置文件(假设php安装路径为/usr/local/php, 配置文件路径/usr/local/php/etc/php-fpm.conf)
# vim /usr/local/php/etc/php-fpm.conf #更改或增加两行内容slowlog = /data/logs/php-slow.logrequest_slowlog_timeout = 2说明:slowlog定义日志路径和名字,request_slowlog_timeout定义超时时间,单位秒,即一个php脚本执行时间超过了该时间,则会记录日志 。
2)重启php-fpm服务
具体重启命令,根据你自己的环境来决定 。配置文件修改后,不重启或者不重载服务是不生效的 。
3)测试
在测试站点里新建一个test.php文件,写入如下内容:
<?php echo "1"; sleep (5); echo "2";然后在浏览器里或者使用curl命令去访问
# curl http://ip/test.php4)结果分析
访问test.php时,我们能感觉到它短暂卡死,大概5秒后出现结果 。此时到/data/logs/php-slow.log里查看,有如下内容:
[pool www] pid 6368script_filename = /data/wwwroot/aminglinux.cc/test.php[0x00007ff8c821f090] sleep() /data/wwwroot/aminglinux.cc/test.php:3这个slow log,不仅可以记录哪一个文件慢,而且也可以记录具体哪一行的什么函数 。有了它,一旦网站访问卡顿,我们就非常方便地找到问题点了 。
< 2 > 线上生产环境演示案例
问题描述:网站访问变卡顿了,不是不能访问,而是变慢了 。
解决过程:
1)登录服务器查看负载,结果不到1,并不高
2)vmstat 1查看发现r列时不时出现不高于5的数字,说明有些进程比较忙
3)用top命令查看,php-fpm进程排在前面
4)查看slow log,结果如下:[29-1月-2019 16:54:59] [pool www] pid 20287script_filename = /data/wwwroot/www.example.com/redirect.php[0x00000000031d83c0] MySQL_query() /data/wwwroot/www.example.com/include/db_mysql.class.php:84[0x00000000031d6bb0] query() /data/wwwroot/www.example.com/redirect.php:105[29-1月-2019 16:54:59] [pool www] pid 23066script_filename = /data/wwwroot/www.example.com/redirect.php[0x000000000319b5a0] mysql_query() /data/wwwroot/www.example.com/include/db_mysql.class.php:84[0x0000000003199d90] query() /data/wwwroot/www.example.com/redirect.php:122通过slow log发现是redirect.php里面有查询数据库的操作慢导致网站访问卡顿 。所以,还需要登录数据库服务器近一步分析为什么MySQL查询慢,这个就涉及到了MySQL的慢查询日志,具体详细的操作我不再阐述 。
< 3 > 使用Xdebug+Webgrind
如果网站跑在了LAMP环境中,就无法使用php-fpm的slow log了,那如何分析瓶颈点?没关系你还可以使用这个Xdebug+Webgrind,其中Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况 。Webgrind是一个网页版的性能分析工具,它的主要作用就是分析Xdebug生成的cachegrind文件,以一种界面友好详尽的方式来展示性能数据 。
Xdebug安装
Xdebug官方网站:http://xdebug.org/.
1)下载源码
如果你用的PHP版本较高,建议下载最新版本
# wget https://xdebug.org/files/xdebug-2.7.0beta1.tgz2)编译安装# tar zxf xdebug-2.7.0beta1.tgz
# cd xdebug-2.7.0beta1
# /usr/local/php-fpm/bin/phpize
# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config
# make && make install
3)配置
# vi /usr/local/php-fpm/etc/php.ini #在最后面增加[xdebug]zend_extension=xdebug.soxdebug.trace_output_dir=/tmp/xdebugxdebug.profiler_output_dir = /tmp/xdebugxdebug.profiler_enable = 1xdebug.profiler_enable_trigger = 14)检查# /usr/local/php-fpm/bin/php -m |grep -C 1 Xdebug[Zend Modules]Xdebug5)创建Xdebug目录# mkdir /tmp/xdebug
# chmod 777 !$
6)重启php-fpm或者Apache服务
因为修改了php.ini配置文件,需要重启对应的服务,才可以生效,我这里用的是php-fpm


推荐阅读