千家信息网

如何定位php程序访问慢

发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,公司的业务是用PHP语言开发的,那么使用的环境十有八九就是LNMP。在日常的运维工作中,占到9成以上的故障是遇到性能问题。你可能会想,我们的业务运行的好好的,为啥平白无故就出现性能问题?原因有太多可能
千家信息网最后更新 2025年01月24日如何定位php程序访问慢

公司的业务是用PHP语言开发的,那么使用的环境十有八九就是LNMP。在日常的运维工作中,占到9成以上的故障是遇到性能问题。
你可能会想,我们的业务运行的好好的,为啥平白无故就出现性能问题?
原因有太多可能,比如代码改动、异常访问、网络波动、服务器硬件故障等等。
引起性能问题的原因有这么多,那如何定位呢?
给大家介绍一个性能追踪的方法,这个方法在我运维职业生涯里屡试不爽,帮了我不少大忙。
- slow log追踪 -
我们可以通过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文件,写入如下内容:
然后在浏览器里或者使用curl命令去访问
# curl http://ip/test.php

4)结果分析
访问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,不仅可以记录哪一个文件慢,而且也可以记录具体哪一行的什么函数。
有了它,一旦网站访问卡顿,我们就非常方便地找到问题点了。

- 线上生产环境演示案例 -

问题描述:
网站访问变卡顿了,不是不能访问,而是变慢了。
解决过程:
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的慢查询日志,具体详细的操作我不再阐述。
- 使用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.soxdebug.trace_output_dir=/tmp/xdebugxdebug.profiler_output_dir = /tmp/xdebugxdebug.profiler_enable = 1xdebug.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"按钮,就会出现漂亮的调用图

文件 配置 性能 网站 分析 服务 问题 内容 环境 目录 程序 结果 主机 命令 工具 数据 方法 日志 时间 服务器 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 什么是诺顿网络安全认证 简述数据库一般设计过程 找不到全文文献的数据库是 广州市信息网络技术有限公司 物联网三层服务器在哪一层 dns服务器安装报告 辛立志软件开发 丰台区软件开发服务电话 服务器准系统带阵列和不带阵列 软件开发如何保证代码外泄 怎样进入简幻欢服务器 数据库金额用什么 太原电力招聘软件开发经理 运维工具提升服务器安全 某医院门诊预约系统的数据库设计 初级软件开发工程师资格证 张店化工管理软件开发公司 恩施软件开发企业 昆明西湖棋牌平台软件开发 网络安全工程的目标包括 汽车软件开发小组任务 成都市济垦柯软件开发工作室 浙江网络安全硬件设备厂家 华为与中国5g网络技术 揭阳自主可控软件开发报价行情 茅山笔记软件开发 东阳爱玩网络技术有限公司 网络安全隐患电台版 关于零件生产数据库关系模式 挖媒网络技术
0