aterrien / forp-profiler
用C语言编写的PHP性能分析器。forp是一个轻量级的PHP扩展,它提供了脚本的全局调用栈,包括CPU和内存使用情况,以纯PHP数组或JSON格式输出。
Requires
- php: >=5.3
This package is not auto-updated.
Last update: 2024-09-24 08:40:44 UTC
README
forp是一个轻量级的PHP扩展,它提供了PHP性能数据。
功能摘要
- 每个函数的时间和分配内存的测量
- CPU使用率
- 函数调用的文件和行号
- 以Google的Trace Event格式输出
- 函数的标题
- 函数分组
- 函数别名(对匿名函数很有用)
forp是非侵入式的,它提供PHP注解来完成其工作。
简单的(几乎是最复杂的)示例
示例
<?php // first thing to do, enable forp profiler forp_start(); // here, our PHP code we want to profile function foo() { echo "Hello world !\n"; }; foo(); // stop forp buffering forp_end(); // get the stack as an array $profileStack = forp_dump(); print_r($profileStack);
结果
Hello world !
Array
(
[utime] => 0
[stime] => 0
[stack] => Array
(
[0] => Array
(
[file] => /home/anthony/phpsrc/php-5.3.8/ext/forp/forp.php
[function] => {main}
[usec] => 94
[pusec] => 6
[bytes] => 524
[level] => 0
)
[1] => Array
(
[file] => /home/anthony/phpsrc/php-5.3.8/ext/forp/forp.php
[function] => foo
[lineno] => 10
[usec] => 9
[pusec] => 6
[bytes] => 120
[level] => 1
[parent] => 0
)
)
)
带有注解的示例
示例
<?php // first thing to do, enable forp profiler forp_start(); /** * here, our PHP code we want to profile * with annotations * * @ProfileGroup("Test") * @ProfileCaption("Foo #1") * @ProfileAlias("foo") */ function fooWithAnnotations($bar) { return 'Foo ' . $bar; } echo "foo = " . fooWithAnnotations("bar") . "\n"; // stop forp buffering forp_end(); // get the stack as an array $profileStack = forp_dump(); echo "forp stack = \n"; print_r($profileStack);
结果
foo = Foo bar
forp stack =
Array
(
[utime] => 0
[stime] => 0
[stack] => Array
(
[0] => Array
(
[file] => /home/anthony/phpsrc/php-5.3.8/ext/forp/forp.php
[function] => {main}
[usec] => 113
[pusec] => 6
[bytes] => 568
[level] => 0
)
[1] => Array
(
[file] => /home/anthony/phpsrc/php-5.3.8/ext/forp/forp.php
[function] => foo
[lineno] => 41
[groups] => Array
(
[0] => Test
)
[caption] => Foo bar
[usec] => 39
[pusec] => 24
[bytes] => 124
[level] => 1
[parent] => 0
)
)
)
php.ini选项
- forp.max_nesting_level : 默认50
- forp.no_internals : 默认0
forp PHP API
- forp_start(flags*) : 开始forp收集器
- forp_end() : 停止forp收集器
- forp_dump() : 返回栈为扁平数组
- forp_print() : 显示forp栈(SAPI CLI)
forp_start()标志
- FORP_FLAG_TIME : 激活收集时间
- FORP_FLAG_MEMORY : 激活收集内存使用情况
- FORP_FLAG_CPU : 获取CPU使用情况
- FORP_FLAG_CAPTION : 启用标题处理器
- FORP_FLAG_ALIAS : 启用别名处理器
- FORP_FLAG_GROUPS : 启用分组处理器
- FORP_FLAG_HIGHLIGHT : 启用HTML高亮
forp_dump()
forp_dump()提供由以下组成的数组
- 全局字段:utime, stime ...
- 栈:一个平展的PHP数组,包含栈条目。
全局字段
- utime:用户函数调用的CPU使用时间
- stime:系统调用的CPU使用时间
栈条目的字段
- file:调用文件
- lineno:调用行号
- class:类名
- function:函数名
- groups:关联组列表
- caption:函数的标题
- usec:函数时间(不含分析开销)
- pusec:内部分析时间(不含执行函数)
- bytes:函数的内存使用量
- level:从forp_start调用的深度级别
- parent:父索引(数字)
forp_json()
将栈直接打印为JSON字符串到stdout。这是将栈发送到兼容JSON客户端的最快方法。
有关其结构,请参阅forp_dump()。
forp_json_google_tracer()
forp_json_google_tracer($filepath)将以Google Trace Event格式输出栈。
用法
// Start profiler forp_start(); my_complex_function(); // Stop profiler forp_end(); // Get JSON and save it into file forp_json_google_tracer("/tmp/output.json");
然后,打开Google Chrome或Chromium浏览器,转到chrome://tracing/。加载输出文件并享受结果。
forp_inspect()
forp_inspect('symbol', $symbol)将以forp_dump()结果中变量的详细表示形式输出。
用法
$var = array(0 => "my", "strkey" => "inspected", 3 => "array"); forp_inspect('var', $var); print_r(forp_dump());
结果
Array ( [utime] => 0 [stime] => 0 [inspect] => Array ( [var] => Array ( [type] => array [size] => 3 [value] => Array ( [0] => Array ( [type] => string [value] => my ) [strkey] => Array ( [type] => string [value] => inspected ) [3] => Array ( [type] => string [value] => array ) ) ) ) )
可用的注解
- @ProfileGroup
设置函数所属的组。
/** * @ProfileGroup("data loading","rendering") */ function exec($query) { /* ... */ }
- @ProfileCaption
向函数添加标题。标题字符串可以包含对函数参数的引用(#)。
/** * @ProfileCaption("Find row for pk #1") */ public function findByPk($pk) { /* ... */ }
- @ProfileAlias
给函数一个别名。对于匿名函数很有用。
/** * @ProfileAlias("MyAnonymousFunction") */ $fn = function() { /* ... */ }
- @ProfileHighlight
在函数生成的输出周围添加框架。
/** * @ProfileHighlight("1") */ function render($datas) { /* ... */ }
演示/用户界面
forp提供了一种非常简单的结构,因此可以轻松制作自己的UI。
但是,如果您正在寻找具有许多功能的高级用户界面,我们已经创建了一个丰富的JavaScript客户端:forp-ui
您可以在最快的PHP框架中看到forp的实际应用。
- Beaba (https://github.com/ichiriac/beaba-light)
- Slim (https://github.com/codeguy/Slim)
- Silex (https://github.com/fabpot/Silex)
- Laravel (https://github.com/laravel/laravel)
构建状态
安装、需求
需求
php5-dev
apt-get install php5-dev
使用Composer进行安装
在项目的composer.json中要求forp-PHP-profiler
"require-dev": { "aterrien/forp-profiler" : "~1.1" }, "repositories" : [ { "type" : "git", "url" : "git@github.com:aterrien/forp-PHP-profiler.git" } ]
运行Composer install
php composer.phar install
编译
cd vendor/aterrien/forp-profiler/ext/forp phpize ./configure make && make install
并在php.ini中启用forp
extension=forp.so
或者选择“老式”安装
使用当前版本
wget https://github.com/aterrien/forp/archive/1.1.0.tar.gz
tar -xvzf 1.1.0.tar.gz
cd 1.1.0/ext/forp
或dev-master(不稳定,风险自负)
git clone https://github.com/aterrien/forp-PHP-profiler
cd forp-PHP-profiler/ext/forp
编译
phpize
./configure
make && make install
并在php.ini中启用forp
extension=forp.so
测试过的操作系统和平台
Apache
Apache/2.2.16 (Debian)
PHP 5.3.8 (cli) (编译:2012年9月25日 22:55:18)
Nginx / php-fpm
nginx版本:nginx/1.2.6
PHP 5.3.21-1dotdeb.0 (fpm-fcgi) PHP 5.4.10-1dotdeb.0 (fpm-fcgi)
云/AWS
Centos 6.3 (AMI)
Apache/2.2.15 (Unix)
PHP 5.4.13 (cli) (编译:2013年3月15日 11:27:51)