aterrien/forp-profiler

用C语言编写的PHP性能分析器。forp是一个轻量级的PHP扩展,它提供了脚本的全局调用栈,包括CPU和内存使用情况,以纯PHP数组或JSON格式输出。

1.1.0 2014-10-12 14:56 UTC

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/。加载输出文件并享受结果。

Example output with an existing Drupal website

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的实际应用。

groups

构建状态

Build Status

安装、需求

需求

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)

贡献者

Anthony Terrien, Ioan Chiriac, Alexis Okuwa, TOMHTML