Tideways和xhgui打造PHP非侵入式监控平台

安装mongodb扩展

yum install php71w-pecl-mongodb

安装tideways_xhprof扩展

wget https://github.com/tideways/php-xhprof-extension/archive/v4.1.6.tar.gz
tar xvf v4.1.6.tar.gz
phpize
./configure
make
sudo make install
php -r "phpinfo();"|less | grep tideways

加载扩展

vim /etc/php.d/tideways.ini

[tideways]
extension=tideways.so
;不需要自动加载,在程序中控制就行
tideways.auto_prepend_library=0
;频率设置为100,在程序调用时能改
tideways.sample_rate=100

检查扩展

php -r "phpinfo();"|less | grep tideways

安装xhgui

这个版本是别人改的中文版 支持composer composer require laynefyc/xhgui-chinese

git clone https://github.com/laynefyc/xhgui-branch.git
cd xhgui-branch
php install.php

修改xhgui配置

vim xhgui/config/config.default.php

'extension' => 'tideways'

测试MongoDB连接情况并优化索引

$ mongo
> use xhprof
> db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } )
> db.results.ensureIndex( { 'profile.main().wt' : -1 } )
> db.results.ensureIndex( { 'profile.main().mu' : -1 } )
> db.results.ensureIndex( { 'profile.main().cpu' : -1 } )
> db.results.ensureIndex( { 'meta.url' : 1 } )

配置xhprof Nginx

解析到 xhgui/webroot 目录即可

配置要检查的项目nginx配置

增加 fastcgi_param PHP_VALUE

location ~ \.php$ {
    ....
    fastcgi_param PHP_VALUE "auto_prepend_file=/usr/src/xhgui/external/header.php";
    .....
}

中途出现过一次502,怎么都找不到原因

最后让公司大佬 给排查错误... 分分钟排错.. 666

502起始

  • 最开始我装了一个 xhprof 扩展,然后我又发现了 tideways 然后我就又装了 tideways 扩展
  • 然后我就按照博文,开始安装. 然后一直502
  • 我只是知道 只要引入那个 header.php 就报错..

大佬排错第一步

header.php
  • 先关闭我所有的扩展(tideways),因为他只知道我有个 tideways
  • 然后发现这个函数代码块1不会报错
  • 自然也就会进入代码块2的 tideways 判断里面, 然后这里就凉了..
  • 然后就发现我装了一个 xhprof 扩展.. 先把 xhprof 扩展关闭
  • 然后发现还是报错.. 然后就怀疑 我是把扩展装错了.. 然后去看了 xhgui 的文档.然后又找到了 php-xhprof-extension ,然后这里很明确的说明了. 要用 php-xhprof-extension 这个扩展
  • 删除之前的 tideways 扩展,重新安装 php-xhprof-extension,发现还是报错
  • 于是.查看了 xhgui/config/config/php 配置文件,修改为 'extension' => 'tideways'
  • 最后,问题完美解决...

最后不得不服排错的能力啊....

代码块1
if (!extension_loaded('xhprof') && !extension_loaded('uprofiler') && !extension_loaded('tideways') && !extension_loaded('tideways_xhprof')) {
    error_log('xhgui - either extension xhprof, uprofiler or tideways must be loaded');
    return;
}

代码块2

$extension = Xhgui_Config::read('extension');
if ($extension == 'uprofiler' && extension_loaded('uprofiler')) {
    uprofiler_enable(UPROFILER_FLAGS_CPU | UPROFILER_FLAGS_MEMORY);
} else if ($extension == 'tideways_xhprof' && extension_loaded('tideways_xhprof')) {
    tideways_xhprof_enable(TIDEWAYS_XHPROF_FLAGS_MEMORY | TIDEWAYS_XHPROF_FLAGS_MEMORY_MU | TIDEWAYS_XHPROF_FLAGS_MEMORY_PMU | TIDEWAYS_XHPROF_FLAGS_CPU);
} else if ($extension == 'tideways' && extension_loaded('tideways')) {
    tideways_enable(TIDEWAYS_FLAGS_CPU | TIDEWAYS_FLAGS_MEMORY);
    tideways_span_create('sql');
} else {
    if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 4) {
        xhprof_enable(XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_NO_BUILTINS);
    } else {
        xhprof_enable(XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);
    }
}

产考文章