黑帽联盟

 找回密码
 会员注册
查看: 1218|回复: 0
打印 上一主题 下一主题

[资源教程] PHP网站访问慢的处理方法

[复制链接]

895

主题

38

听众

3322

积分

管理员

Rank: 9Rank: 9Rank: 9

  • TA的每日心情

    前天 13:01
  • 签到天数: 1643 天

    [LV.Master]伴坛终老

    如果你们公司的业务是用PHP语言开发的,那么使用的环境十有八九就是LNMP,在日常的运维工作中,占到9成以上的故障是遇到性能问题。

    你可能会想,我们的业务运行的好好的,为啥平白无故就出现性能问题?原因有太多可能,比如代码改动、异常访问、网络波动、服务器硬件故障等等。

    引起性能问题的原因有这么多,那如何定位呢?本章就来给大家介绍一个性能追踪的方法,这个方法在我运维职业生涯里屡试不爽,帮了我不少大忙。
    < 1 >
    PHP-FPM的slow log

    如果你所运维的网站或者应用为PHP的,那我相信你一定对LAMP或者LNMP不陌生。我主张使用LNMP,原因无他,就一点 -- 我们可以通过slow log很方便地追踪到问题点。先来看配置方法吧。

    1)编辑配置文件(假设php安装路径为/usr/local/php, 配置文件路径/usr/local/php/etc/php-fpm.conf)

    1. # vim /usr/local/php/etc/php-fpm.conf #更改或增加两行内容
    2. slowlog = /data/logs/php-slow.log
    3. request_slowlog_timeout = 2
    复制代码
    说明:slowlog定义日志路径和名字,request_slowlog_timeout定义超时时间,单位秒,即一个php脚本执行时间超过了该时间,则会记录日志。
    2)重启php-fpm服务具体重启命令,根据你自己的环境来决定。配置文件修改后,不重启或者不重载服务是不生效的。
    3)测试在测试站点里新建一个test.php文件,写入如下内容:

    1. <?php
    2.     echo "1";
    3.     sleep (5);
    4.     echo "2";
    复制代码
    然后在浏览器里或者使用curl命令去访问
    1. # curl http://ip/test.php
    复制代码
    4)结果分析访问test.php时,我们能感觉到它短暂卡死,大概5秒后出现结果。此时到/data/logs/php-slow.log里查看,有如下内容:

    1. [pool www] pid 6368
    2. script_filename = /data/wwwroot/aminglinux.cc/test.php
    3. [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,结果如下:
    1. [29-1月-2019 16:54:59]  [pool www] pid 20287
    2. script_filename = /data/wwwroot/www.example.com/redirect.php
    3. [0x00000000031d83c0] mysql_query() /data/wwwroot/www.example.com/include/db_mysql.class.php:84
    4. [0x00000000031d6bb0] query() /data/wwwroot/www.example.com/redirect.php:105

    5. [29-1月-2019 16:54:59]  [pool www] pid 23066
    6. script_filename = /data/wwwroot/www.example.com/redirect.php
    7. [0x000000000319b5a0] mysql_query() /data/wwwroot/www.example.com/include/db_mysql.class.php:84
    8. [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版本较高,建议下载最新版本

    1. # wget https://xdebug.org/files/xdebug-2.7.0beta1.tgz
    复制代码
    2)编译安装

    1. # tar zxf xdebug-2.7.0beta1.tgz
    2. # cd xdebug-2.7.0beta1
    3. # /usr/local/php-fpm/bin/phpize
    4. # ./configure --with-php-config=/usr/local/php-fpm/bin/php-config
    5. # make && make install
    复制代码
    3)配置

    1. # vi /usr/local/php-fpm/etc/php.ini  #在最后面增加
    复制代码

    1. [xdebug]
    2. zend_extension=xdebug.so
    3. xdebug.trace_output_dir=/tmp/xdebug
    4. xdebug.profiler_output_dir = /tmp/xdebug
    5. xdebug.profiler_enable = 1
    6. xdebug.profiler_enable_trigger = 1
    复制代码
    4)检查

    1. # /usr/local/php-fpm/bin/php -m |grep -C 1 Xdebug
    2. [Zend Modules]
    3. Xdebug
    复制代码
    5)创建Xdebug目录

    1. # mkdir /tmp/xdebug
    2. # chmod 777 !$
    复制代码
    6)重启php-fpm或者apache服务因为修改了php.ini配置文件,需要重启对应的服务,才可以生效,我这里用的是php-fpm
    1. # /etc/init.d/php-fpm restart
    复制代码
    Webgrind安装
    1)下载Webgrind官方github地址https://github.com/jokkedk/webgrind

    1. # wget https://codeload.github.com/jokkedk/webgrind/zip/v1.5.0
    2. # mv v1.5.0  webgrind-1.5.0.zip
    3. # unzip webgrind-1.5.0.zip
    复制代码
    2)为Webgrind配置站点Webgrind其实是一个PHP网站程序,需要为其设置一个虚拟主机,我用的是LNMP环境,所以需要配置Nginx, 当然你也可以直接把webgrind程序目录丢到一个站点内,通过二级目录去访问。下面是我的Nginx虚拟主机配置文件内容:
    1. server {
    2.     listen       80;
    3.     server_name webgrind.aminglinux.cc;

    4.     root   /data/wwwroot/webgrind;
    5.     index  index.html index.htm index.php;

    6.     location ~ \.php$ {
    7.         fastcgi_pass   127.0.0.1:9001;
    8.         fastcgi_index  index.php;
    9.         fastcgi_param  SCRIPT_FILENAME  /data/wwwroot/webgrind$fastcgi_script_name;
    10.         include        fastcgi_params;
    11.     }
    复制代码
    3)配置webgrind假如新配置的虚拟主机目录为/data/wwwroot/webgrind
    1. # mv webgrind-1.5.0/* /data/wwwroot/webgrind/
    2. # vim config.php  #修改$storeageDir和$profileDir
    3. static $storageDir = '/tmp/xdebug';
    4. static $profilerDir = '/tmp/xdebug';
    复制代码
    4)性能追踪首先访问要追踪性能的PHP网站,然后查看/tmp/xdebug目录下是否生成文件
    1. # ls /tmp/xdebug/
    2. cachegrind.out.11442  cachegrind.out.11443  cachegrind.out.11443.091dcb
    复制代码
    我的已经生成3个文件,然后在浏览器访问即可,不过需要你先选择脚本文件(右上角),点击update之后才会出现分析内容。
    2121.jpg

    5)图形显示我们还可以把PHP代码中的各个函数调用关系以图形的形式展现出来,这样更加直观。前提是需要python和dot两个工具的支持,python默认机器上自带,但是dot需要安装
    1. # yum install -y graphviz
    复制代码
    点击右上角的“show call graph”按钮,就会出现漂亮的调用图
    2122.jpg
    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    勿忘初心,方得始终!
    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部