php7 Tideways+xhgui监控PHP性能

前提已安装:

    php5.4+

    nginx

    mongod

    mongo

    composer


1.安装PHP tideaways扩展;

tideaways的文档写的非常详细,安装  tideaways扩展(官方文档) 这里我用Centos举例。其它系统看官方文档里面

echo "[tideways]
name = Tideways
baseurl = https://s3-eu-west-1.amazonaws.com/qafoo-profiler/rpm" > /etc/yum.repos.d/tideways.repo
rpm --import https://s3-eu-west-1.amazonaws.com/qafoo-profiler/packages/EEB5E8F4.gpgyum makecache --disablerepo=* --enablerepo=tideways
yum install tideways-php tideways-cli tideways-daemon

PS: MarkDown的语法转换可能存在问题,容易把中划线转没了,建议安装时从官网COPY命令,安装tideaways扩展


修改php.ini文件;

我们需要在php.ini文件中引入扩展

extension=mongodb.so
extension=/usr/lib/tideways/tideways.so  // 这个地址在安装的时候会显示,下面有多个PHP对应版本 ls /usr/lib/tideways
;不需要自动加载,在程序中控制就行
tideways.auto_prepend_library=1
;频率设置为100,在程序调用时能改
tideways.sample_rate=100


2.安装xhprof扩展(php7+);

git clone https://github.com/longxinH/xhprof
cd xhprof/extension/
phpize
./configure 
make
make install

加入php.ini

extension=xhprof.so

2.安装xhprof扩展(php5+);

wget http://pecl.php.net/get/xhprof-0.9.4.tgz
tar zxvf xhprof-0.9.4.tgz 
cd xhprof-0.9.4/extension/
phpize
./configure 
make
make install

加入php.ini

extension=xhprof.so


3.安装xhgui;

composer require laynefyc/xhgui-chinese
cd vendor/laynefyc/xhgui-chinese
composer update

有问题的话解决掉,如果提示没mongodb的扩展,就去 https://pecl.php.net/get/mongodb-1.4.2.tgz 下载安装最新mongodb扩展,解决完问题再composer update,直到成功为止


你也可以通过下面方法去安装,

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


PS: xhgui官方版本已经很久不更新,很多符号和单位都不适合中国用户。这个laynefyc汉化的版本,安装这个版本,将有更好的体验。如果你一定要安装原版请执行下面的命令

git clone https://github.com/perftools/xhgui
cd xhgui
php install.php

修改配置文件,如果你的MongoDB安装在当前机器可以不用修改xhgui的配置文件,否则你需要在配置文件中修改MongoDB的连接ip和域名,路径如下:xhgui/config/config.default.php

// Can be either mongodb or file.
   /*
   'save.handler' => 'file',
   'save.handler.filename' => dirname(__DIR__) . '/cache/' . 'xhgui.data.' . microtime(true) . '_' . substr(md5($url), 0, 6),
   */
   'save.handler' => 'mongodb',
   // Needed for file save handler. Beware of file locking. You can adujst this file path
   // to reduce locking problems (eg uniqid, time ...)
   //'save.handler.filename' => __DIR__.'/../data/xhgui_'.date('Ymd').'.dat',
   'db.host' => 'mongodb://127.0.0.1:27017', //如果是远程的则为 'mongodb://用户名:密码@172.16.5.105:27017',
   'db.db' => 'xhprof',

测试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 } )


4.配置Nginx;

Nginx需要加入两处配置,一是添加PHP_VALUE,告诉PHP程序在执行前要调用服务,在被监听的程序conf中加:

server {
  listen 80;
  server_name site.localhost;
  root xxx;
  fastcgi_param PHP_VALUE "auto_append_file=/home/admin/xhgui/external/header.php";
}

注意:PHP_VALUE设置成功后,可以php_info里面看到auto_append_file这个选项。

PHP_VALUE在nginx里面只允许设置一行,如果有多行,用 \n 隔开 ,例:

fastcgi_param PHP_VALUE "auto_prepend_file=prepend.php \n auto_append_file=append.php";

另一个是需要配置一个路径指向xhgui的webroot目录,是为了xhgui能用域名访问,如下配置是通过单独的域名来访问:

server {
    listen       80;
    server_name  monitor.mkphp.com;
        root   /home/admin/xhgui/webroot;
        index  index.html index.php;
        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass    127.0.0.1:9000;
                fastcgi_index   index.php;
                fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include         fastcgi_params;
        }
        location ^~/log{
                deny all;
        }
        location / {
                if (!-e $request_filename) {
                        rewrite ^(.*)$ /index.php?s=$1 last;
                        break;
                }
        }
}

如果安装很顺利,此时访问 http://mkphp.com 能看到效果。详细的效果图可以看这里 https://github.com/laynefyc/xhgui-branch


最后说说频率如何配置? 配置项在xhgui的config/config.default.php文件中,profiler.enable是个bool型变量,表示是否采样。

'profiler.enable' => function() {
    // 如果域名为我们新建的域名则不捕获
    if($_SERVER['SERVER_NAME'] == 'blog110.it2048.cn'){
        return False;
    }else{
        // 100%采样,默认为1%
        return True;//rand(1, 100) === 42;
    }
}

数据存储到MongoDB之后,UI如何展示需要自己探究。比如将英文换成中文,添加曲线图和饼图等等。至此已经能实时监控我们项目的CPU、内存的消耗情况。哪些接口执行慢也能一目了然。