非侵入式监控PHP应用性能监控分析

本文涉及的产品
云拨测,每月3000次拨测额度
简介:

前言

所谓非侵入式监控PHP应用性能,就是不修改现有系统代码,而对系统进行监控。这样的系统才能更容易的应用到PHP应用中。这里抛砖引玉,欢迎大家交流。

方案一

如果只是监控每次请求的访问时间。直接检测nginx的日志即可。在nginx的日志中有两个选项。$request_time 和 $upstream_response_time 。 这两个选项记录了响应时间。
1、$request_time 指的就是从接受用户请求的第一个字节到发送完响应数据的时间,即包括接收请求数据时间、程序响应时间、输出响应数据时间。
2、$upstream_response_time 是指从Nginx向后端(php-cgi)建立连接开始到接受完数据然后关闭连接为止的时间。
如果只是监控后端PHP服务的性能,只要更多的关注 $upstream_response_time 这个选项即可。

方案二

如果还想进一步一个PHP请求处理过程中,具体那部分占用时间比较多,就需要借助xhprof了。xhprof可以生成调用关系图,一目了然的可以看出那部分占用时间比较多。如下图(来源于网络):
xhprof_20160126

<img src="http://www.bo56.com/wp-content/uploads/2016/01/xhprof_20160126.png" alt="xhprof_20160126" width="1035" height="1299" class="alignnone size-full wp-image-950" /></a></p>

下面是完整的搭建步骤:

下载安装xhprof

1、下载编译安装的命令如下:

$wget https://github.com/phacility/xhprof/archive/master.zip
$unzip ./xhprof_master.zip
$cd ./xhprof_master/extension
$/usr/local/php/bin/phpize
$./configure --with-php-config=/usr/local/php/bin/php-config
$make
$make install
 

注意,我的php是安装在/usr/local/php目录。根据您的情况,适当修改上面的路径。

2、修改配置文件php.ini


$vim /etc/php.ini

底部增加如下内容:
[xhprof]
extension=xhprof.so
xhprof.output_dir=/tmp/xhprof

3、通过下面的命令检测xhprof是否安装成功

$/usr/local/php/bin/php -m

如果以上命令输出内容中有xhprof字样,说明xhprof扩展安装成功。

4、拷贝xhprof相关程序到指定目录

$mkdir -p /www/sites/xhprof
$cp -r ./xhprof_master/xhprof_html /www/sites/xhprof
$cp -r ./xhprof_master/xhprof_lib /www/sites/xhprof
5、修改nginx配置,以便通过url访问性能数据:
在nginx中增加如下代码:
server {
        listen  8999;
        root    /opt/sites/xhprof/;
        index  index.php index.html;
        location ~ .*\.php$ {
        add_header  Cache-Control "no-cache, no-store, max-age=0, must-revalidate";
        add_header  Pragma  no-cache;
        add_header Access-Control-Allow-Origin *;
        add_header      Via "1.0 xgs-150";
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        include fastcgi.conf;
        fastcgi_connect_timeout 300; 
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        }   
}
6、部署性能数据采集程序
把xhprof.php文件部署到 /www/sites/xhprof.php 。xhprof.php文件内容如下:
<?php
define("XH_LOG_PATH", "/tmp/xhprof.log");
$xh_force_disable = false; //设置性能分析是否启用,设置为true表示关闭。
$max_time = 100; //millisecond
 
$xh_enable = false;
$start_time = microtime(true);
 
//这里可以设置需要进行性能分析的url和设置的超时时间。如果指定的url,响应时间超过了设置的超时时间,性能分析数据就会被记录下来。超时时间的单位为毫秒。
$xh_conf["urls"] = array(
    //url => max_time
    "/i/content/getdetail.json" => 100,
);
 
function xh_save_data(){
    global $start_time, $xh_force_disable, $xh_enable, $max_time;
    $end_time = microtime(true);
    $cost_time = $end_time - $start_time;
    $cost_time *= 1000; 
    if( $cost_time > $max_time && !$xh_force_disable && $xh_enable ){
        include_once "/www/sites/xhprof/xhprof_lib/utils/xhprof_lib.php";
        include_once "/www/sites/xhprof/xhprof_lib/utils/xhprof_runs.php";
        $xhprof_data = xhprof_disable();
        $objXhprofRun = new XHProfRuns_Default();
        $run_id = $objXhprofRun->save_run($xhprof_data, "xhprof");
        $log_data = "cost_time||$cost_time||run_id||$run_id||request_uri||".$_SERVER["REQUEST_URI"]."\n";
        //高并发下 可能会出现错乱情况。建议把 const_time run_id request_uri 写入到数据库
        file_put_contents(XH_LOG_PATH, $log_data, FILE_APPEND);
    }
}
$xh_request_uri = isset($_SERVER["REQUEST_URI"]) ? $_SERVER["REQUEST_URI"] : "";
$arr_xh_cur_url = explode("?", $xh_request_uri);
$xh_cur_url = $arr_xh_cur_url[0];
if( !$xh_force_disable && isset($xh_conf["urls"][$xh_cur_url]) ){
    $xh_enable = true;
    $max_time = $xh_conf["urls"][$xh_cur_url];
    xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
    register_shutdown_function("xh_save_data"); 
}else{
    $xh_enable = false;
}
?>

把这个代码文件部署到/www/sites/xhprof.php目录后,就可以启用这个文件了。因为我们想对PHP应用代码不进行代码侵入,那么我们就只能通过如下几种方式启用:
* Nginx/PHP-FPM 方式:
fastcgi_param PHP_VALUE "auto_prepend_file=/www/sites/xhprof.php";
* Apache 方式:
php_value auto_prepend_file "/www/sites/xhprof.php"
* php.ini 方式:
auto_prepend_file="/www/sites/xhprof.php"
注意:如果使用了 opcode 缓存,记得要重启你的 php 进程。

7、查看性能分析日志
$tail /tmp/xhprof.log
$cost_time||200||run_id||adadfdsadad||request_uri||/i/content/getcontent.json
上面输出内容中:
cost_time 耗时 200毫秒
run_id 为 adadfdsadad
request_uri 为 /i/content/getcontent.json

8、根据run_id 查看性能分析数据
http://127.0.0.1:8999/xhprof_html/index.php?run=adadfdsadad
查看方式请参考 http://www.cnblogs.com/siqi/p/3790186.html

注意:
1、在正式启用前,一定要确认不会影响正常的数据输出。确认输出内容无异后,再上线。
2、每个url的max_time不要设置的过小。
3、xhprof会影响线上服务的性能,因此最好只在一台机器上进行监控,或者 修改xhprof.php代码,对请求进行随机监控。


目录
相关文章
|
30天前
|
PHP 数据安全/隐私保护
PHP中的面向对象编程思想及应用
在当今互联网技术飞速发展的背景下,PHP作为一种广泛应用的服务器端脚本语言,其面向对象编程思想日益受到重视。本文将深入探讨PHP中的面向对象编程特点、优势以及实际应用,帮助读者更好地理解和运用面向对象编程思想。
|
2月前
|
JSON 监控 PHP
企业局域网监控软件的扩展性设计:PHP插件开发指南
在企业网络环境中,对局域网进行监控是至关重要的。为了满足不同企业的需求,我们需要一种灵活可扩展的监控软件,能够根据具体情况进行定制和扩展。本文将介绍如何利用PHP插件来实现企业局域网监控软件的扩展性设计,并提供一些代码示例,帮助读者更好地理解和应用这一技术。
171 2
|
6月前
|
Prometheus 监控 Cloud Native
【云原生】Docker容器命令监控+Prometheus监控平台
【云原生】Docker容器命令监控+Prometheus监控平台
210 0
【云原生】Docker容器命令监控+Prometheus监控平台
|
3月前
|
Serverless PyTorch 算法框架/工具
Serverless应用引擎部署问题之下个节点不可用如何解决
Serverless部署是指将应用程序部署到无服务器架构中,该架构允许开发者专注于代码而无需关心底层服务器的运行和维护;针对Serverless部署过程中可能遇到的挑战,本合集提供全面的指南和最佳实践,帮助开发者顺利实现应用的无服务器化部署。
366 2
|
24天前
|
PHP
PHP 7.4的新特性及实践应用
【4月更文挑战第2天】本文主要介绍了PHP 7.4的新特性,并通过实例代码展示了如何在实际项目中应用这些新特性。文章首先简要回顾了PHP的发展历史,然后详细分析了PHP 7.4的新特性,包括预加载、数组解构、扩展的返回类型声明等。接下来,通过实际代码示例,演示了如何在项目中使用这些新特性。最后,总结了PHP 7.4新特性的优势和局限性,并展望了PHP未来的发展趋势。
|
1月前
|
安全 大数据 编译器
深入理解PHP 8.0的新特性及实践应用
【2月更文挑战第30天】随着PHP 8.0的发布,这一流行的服务器端脚本语言带来了许多令人兴奋的新特性和性能改进。本文将深入探讨PHP 8.0的关键新特性,包括JIT编译器、联合类型、名称参数、匹配表达式等,并通过实际代码示例展示如何利用这些新工具来编写更加高效、简洁和健壮的应用程序。无论您是PHP开发者还是对最新技术趋势感兴趣的技术爱好者,本文都将为您提供宝贵的信息和启发。
21 3
|
1月前
|
数据采集 存储 JavaScript
PHP爬虫技术:利用simple_html_dom库分析汽车之家电动车参数
本文旨在介绍如何利用PHP中的simple_html_dom库结合爬虫代理IP技术来高效采集和分析汽车之家网站的电动车参数。通过实际示例和详细说明,读者将了解如何实现数据分析和爬虫技术的结合应用,从而更好地理解和应用相关技术。
PHP爬虫技术:利用simple_html_dom库分析汽车之家电动车参数
|
2月前
|
Rust 监控 算法
Rust中的系统性能监控与调优:提升应用效能的关键实践
随着Rust在系统级编程中的广泛应用,性能监控与调优变得尤为关键。本文介绍了在Rust中实施系统性能监控的方法,探讨了Rust应用的性能瓶颈,并提供了调优策略与最佳实践,旨在帮助开发者更有效地提升Rust应用的性能。
|
2月前
|
监控 关系型数据库 MySQL
PHP与MySQL的结合:实现局域网上网行为监控软件的数据库管理
在当今信息化时代,网络安全日益成为重要的话题。为了有效监控和管理局域网上网行为,开发一个基于PHP和MySQL的数据库管理系统是一个理想的选择。本文将介绍如何结合PHP和MySQL,开发一款简单而高效的局域网上网行为监控软件,并重点关注数据库管理方面的实现。
196 0
|
3月前
|
缓存 弹性计算 NoSQL
您在使用Serverless应用引擎(SAE)部署PHP应用时遇到了性能问题
【1月更文挑战第12天】【1月更文挑战第57篇】您在使用Serverless应用引擎(SAE)部署PHP应用时遇到了性能问题
354 1