百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

PHP网站访问慢的处理方法,技术人员需要掌握的技能

yuyutoo 2024-11-11 16:49 2 浏览 0 评论

如果公司的业务是用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)


# vim /usr/local/php/etc/php-fpm.conf #更改或增加两行内容
slowlog = /data/logs/php-slow.log
request_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.php


4)结果分析

访问test.php时,我们能感觉到它短暂卡死,大概5秒后出现结果。此时到/data/logs/php-slow.log里查看,有如下内容:

[pool www] pid 6368
script_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 20287
script_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 23066
script_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.tgz
2)编译安装

# 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.so
xdebug.trace_output_dir=/tmp/xdebug
xdebug.profiler_output_dir = /tmp/xdebug
xdebug.profiler_enable = 1
xdebug.profiler_enable_trigger = 1
4)检查

# /usr/local/php-fpm/bin/php -m |grep -C 1 Xdebug
[Zend Modules]
Xdebug
5)创建Xdebug目录

# mkdir /tmp/xdebug

# chmod 777 !$

6)重启php-fpm或者apache服务

因为修改了php.ini配置文件,需要重启对应的服务,才可以生效,我这里用的是php-fpm

# /etc/init.d/php-fpm restart

Webgrind安装

1)下载

Webgrind官方github地址https://github.com/jokkedk/webgrind

# wget https://codeload.github.com/jokkedk/webgrind/zip/v1.5.0
# mv v1.5.0 webgrind-1.5.0.zip
# unzip webgrind-1.5.0.zip

2)为Webgrind配置站点

Webgrind其实是一个PHP网站程序,需要为其设置一个虚拟主机,我用的是LNMP环境,所以需要配置Nginx, 当然你也可以直接把webgrind程序目录丢到一个站点内,通过二级目录去访问。下面是我的Nginx虚拟主机配置文件内容:

server {

listen 80;

server_name webgrind.aminglinux.cc;

root /data/wwwroot/webgrind;

index index.html index.htm index.php;

location ~ \.php$ {

fastcgi_pass 127.0.0.1:9001;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /data/wwwroot/webgrind$fastcgi_script_name;

include fastcgi_params;

}

3)配置webgrind

假如新配置的虚拟主机目录为/data/wwwroot/webgrind

# mv webgrind-1.5.0/* /data/wwwroot/webgrind/

# vim config.php #修改$storeageDir和$profileDir

static $storageDir = '/tmp/xdebug';

static $profilerDir = '/tmp/xdebug';

4)性能追踪

首先访问要追踪性能的PHP网站,然后查看/tmp/xdebug目录下是否生成文件

# ls /tmp/xdebug/

cachegrind.out.11442 cachegrind.out.11443 cachegrind.out.11443.091dcb

我的已经生成3个文件,然后在浏览器访问即可,不过需要你先选择脚本文件(右上角),点击update之后才会出现分析内容。

5)图形显示

我们还可以把PHP代码中的各个函数调用关系以图形的形式展现出来,这样更加直观。前提是需要python和dot两个工具的支持,python默认机器上自带,但是dot需要安装

# yum install -y graphviz

点击右上角的“show call graph”按钮,就会出现漂亮的调用图

相关推荐

jQuery VS AngularJS 你更钟爱哪个?

在这一次的Web开发教程中,我会尽力解答有关于jQuery和AngularJS的两个非常常见的问题,即jQuery和AngularJS之间的区别是什么?也就是说jQueryVSAngularJS?...

Jquery实时校验,指定长度的「负小数」,小数位未满末尾补0

在可以输入【负小数】的输入框获取到焦点时,移除千位分隔符,在输入数据时,实时校验输入内容是否正确,失去焦点后,添加千位分隔符格式化数字。同时小数位未满时末尾补0。HTML代码...

如何在pbootCMS前台调用自定义表单?pbootCMS自定义调用代码示例

要在pbootCMS前台调用自定义表单,您需要在后台创建表单并为其添加字段,然后在前台模板文件中添加相关代码,如提交按钮和表单验证代码。您还可以自定义表单数据的存储位置、添加文件上传字段、日期选择器、...

编程技巧:Jquery实时验证,指定长度的「负小数」

为了保障【负小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【负小数】的方法。HTML代码<inputtype="text"class="forc...

一篇文章带你用jquery mobile设计颜色拾取器

【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...

编程技巧:Jquery实时验证,指定长度的「正小数」

为了保障【正小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【正小数】的方法。HTML做成方法<inputtype="text"class="fo...

jquery.validate检查数组全部验证

问题:html中有多个name[],每个参数都要进行验证是否为空,这个时候直接用required:true话,不能全部验证,只要这个数组中有一个有值就可以通过的。解决方法使用addmethod...

Vue进阶(幺叁肆):npm查看包版本信息

第一种方式npmviewjqueryversions这种方式可以查看npm服务器上所有的...

layui中使用lay-verify进行条件校验

一、layui的校验很简单,主要有以下步骤:1.在form表单内加上class="layui-form"2.在提交按钮上加上lay-submit3.在想要校验的标签,加上lay-...

jQuery是什么?如何使用? jquery是什么功能组件

jQuery于2006年1月由JohnResig在BarCampNYC首次发布。它目前由TimmyWilson领导,并由一组开发人员维护。jQuery是一个JavaScript库,它简化了客户...

django框架的表单form的理解和用法-9

表单呈现...

jquery对上传文件的检测判断 jquery实现文件上传

总体思路:在前端使用jquery对上传文件做部分初步的判断,验证通过的文件利用ajaxFileUpload上传到服务器端,并将文件的存储路径保存到数据库。<asp:FileUploadI...

Nodejs之MEAN栈开发(四)-- form验证及图片上传

这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能。开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R...

大数据开发基础之JAVA jquery 大数据java实战

上一篇我们讲解了JAVAscript的基础知识、特点及基本语法以及组成及基本用途,本期就给大家带来了JAVAweb的第二个知识点jquery,大数据开发基础之JAVAjquery,这是本篇文章的主要...

推荐四个开源的jQuery可视化表单设计器

jquery开源在线表单拖拉设计器formBuilder(推荐)jQueryformBuilder是一个开源的WEB在线html表单设计器,开发人员可以通过拖拉实现一个可视化的表单。支持表单常用控件...

取消回复欢迎 发表评论: