English | 简体中文
- 🌈 获取详细的PHP运行时数据。
- 🌍 监控生产环境耗时请求。
- 🛡 显示底层函数的内存与CPU消耗。
- 🎨 运用各种可视化图形显示数据。
- uprofiler,xhprof,tideways等扩展(安装多个会有冲突,默认安装tideways)
- composer
- PHP 5.6+
如果使用PHP 5.6,请下载tideways v4.1.5。如果使用PHP7+ ,请下载v4.1.7(更高的版本无法显示SQL)。
wget --no-check-certificate https://github.com/tideways/php-xhprof-extension/archive/v4.1.7.tar.gz && tar zxvf v4.1.7.tar.gz && cd php-xhprof-extension-4.1.7 && phpize && ./configure && make && sudo make install
安装后需要在php.ini
文件中添加扩展引入命令:
extension=tideways.so
通过如下命令可查看扩展是否安装成功:
> php --ri tideways
tideways
tideways => 4.1.7
composer create-project --prefer-dist --ignore-platform-reqs laynefyc/php-monitor php-monitor && cd php-monitor/public && php -S 127.0.0.1:8066
访问 http://127.0.0.1:8066 会要求输入账号和密码,默认都为 php
-
下载&更新项目
composer create-project --prefer-dist --ignore-platform-reqs laynefyc/php-monitor php-monitor
或者
git clone https://github.com/laynefyc/php-monitor.git cd php-monitor composer update --ignore-platform-reqs
-
设置数据存储方式,支持MySQL,MongoDB,Sqlite
在配置文件
src/config/config.php
中设置,信息如下:// 'save' => [ // 'driver' => 'mysql', // 'host' => '127.0.0.1:3306', // 'database' => 'php_monitor', // 'username' => '', // 'password' => 'abcd1234', // 'charset' => 'utf8mb4' // ], // 'save' => [ // 'driver' => 'mongodb', // 'host' => '127.0.0.1:27017', // 'database' => 'php_monitor', // 'username' => '', // 'password' => '' // ], 'save' => [ 'driver' => 'sqlite', 'database' => dirname(__DIR__).'/db/php_monitor.sqlite3' ],
本项目默认使用Sqlite,因为Sqlite是轻量级的文件数据库。如果使用其他数据库请取消对应的注释。
使用MySQL请运行如下建表语句(表名不可修改):
CREATE TABLE `php_monitor` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增编号', `url` text CHARACTER SET utf8 COMMENT '请求URL', `server_name` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '服务名', `get` text COMMENT 'GET参数', `pmu` int(11) unsigned DEFAULT NULL COMMENT '内存峰值', `wt` int(11) unsigned DEFAULT NULL COMMENT '总耗时微秒', `cpu` int(11) unsigned DEFAULT NULL COMMENT '总cpu周期时间', `ct` int(3) NOT NULL COMMENT '总调用次数', `mu` int(11) unsigned DEFAULT NULL COMMENT '当前内存消耗', `request_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '请求时间,到秒', `request_time_micro` int(10) unsigned DEFAULT '0' COMMENT '请求微秒', `profile` longblob NOT NULL COMMENT '性能数据', `server` longblob COMMENT 'SERVER参数', `type` varchar(16) DEFAULT NULL COMMENT '请求类型GET,POST', `ip` varchar(16) DEFAULT NULL COMMENT 'IP地址', PRIMARY KEY (`id`), KEY `idx_url` (`url`), KEY `idx_ip` (`ip`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
使用MongoDB数据库会自己建表,但需要自己添加索引,添加方式如下:
show dbs use php_monitor //数据库选择你自己的 db.php_monitor.createIndex({"url":1}) db.php_monitor.createIndex({"ip":1})
所有数据存储方式的表名都必须为
php_monitor
不支持修改。 -
运行本监控平台
测试时可直接通过如下命令如下:
cd php-monitor/public php -S 127.0.0.1:8066
运行成功后直接访问 http://127.0.0.1:8066
非测试环境请使用Nginx,配置如下:
server { listen 8066; server_name localhost; root /home/www/cai/php-monitor/public; index index.php index.html; location / { root /home/www/cai/php-monitor/public; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/index.php; } }
-
登录后台
登录账号密码可以直接在配置文件中修改,
src/config/config.php
。'user' => [ //login account and password ['account'=>'php','password'=>'php'], ['account'=>'admin','password'=>'abcd'] ]
account是帐号,password是密码,发布后请及时修改。 如果对安全等级要求更高,请扩展 LoginController.php 文件的 accountAction 方法。
-
在需要监控的项目中引入监控
本项目采用非侵入式的方式进行项目监控,对运行中的服务不会有任何干扰。
在项目中添加监控有两种方式,一是修改Nginx配置:
比如要对运行中的服务 www.site.com 做监控,你只需要在Nginx配置文件中加一行配置信息
fastcgi_param PHP_VALUE "auto_prepend_file={php-monitor-path}/src/autoPrepend.php";
添加配置后的效果如下(其他内容只是为了演示说明,并不是要求你的nginx配置和我的一样):
server { listen 80; server_name www.site.com; root your/webroot/; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PHP_VALUE "auto_prepend_file={php-monitor-path}/src/autoPrepend.php"; } }
这种方式是使用PHP提供的
auto_prepend_file
接口,接口文档 https://www.php.net/manual/zh/ini.core.php#ini.auto-prepend-file,添加配置后需要重启nginx.第二种方式是直接在需要监控项目的入口文件引入,通常是在
public/index.php
中添加:require '/home/www/cai/php-monitor/src/autoPrepend.php';
添加配置后的效果如下(除核心代码,其他代码都是为了演示说明):
<?php use pm\common\Router; //核心代码在此 require '/home/www/cai/php-monitor/src/autoPrepend.php'; include 'vendor/autoload.php'; $config = require('src/config/config.php'); (new Router($config))->run();
添加埋点之后,www.site.com 项目的请求记录可在 http://127.0.0.1:8066 监控后台查看。
-
更多细节
- MongoDB的存储速度最快,如果对性能要求高,请优先使用它;
- 修改配置文件的 profiler.enable 属性来修改采样频率,通常来说并不需要将所有请求都存储。比如
rand(1, 100) > 60
就是设置采样率为40%
; - 修改配置文件的 profiler. filter_path 属性来过滤不想收集的服务,比如一些不关心执行效率的内网服务;
-
Swoole与Workerman支持
Swoole和Workerman中无法使用
register_shutdown_function()
函数,需要手动运行\pm\common\PMonitor::shutdown()
方法public function onReceive(\swoole_server $serv, $fd, $from_id, $dataSrc) { require '/home/www/cai/php-monitor/src/autoPrepend.php'; //your code \pm\common\PMonitor::shutdown($url,$serv->getClientInfo($fd,$from_id)['remote_ip'],'GET'); }
- Sqlite存储方式开发;
- 完善国际化;
- 完善文档;
- CI流程接入;
- 补充单元测试;
- Composer包封装;
- 重写xhprof扩展;
- 埋点模块与展示模块拆分;
- Docker接入;
提交ISSUE或者加我微信