ThinkPHP中的行为是一个比较抽象的概念,你可以把行为想象成在应用执行过程中的一个动作。

不熟悉的xhprof的,请参考前一篇文章:http://www.tech1024.com/original/2990.html

如果你还不了解thinkphp的钩子行为,可以参考手册:https://www.kancloud.cn/manual/thinkphp5_1/354129

首先,我们在application/tags.php文件中,定义性能分析的行为,分别绑定在app_initapp_initApp初始化标和应用结束的钩子上:

return [

    // 应用初始化
    'app_init'     => [
        'app\\common\\behavior\\XhprofEnable',
    ],

    // ...省略其他代码

    // 应用结束
    'app_end'      => [
        'app\\common\\behavior\\XhprofDisable',
    ],

    // ...省略其他代码
];

创建开始分析行为:

application/common/behavior/XhprofStart.php

<?php
namespace app\common\behavior;

/**
 * 开始性能分析
 */
class XhprofStart
{
    public function run($params)
    {
        xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);
    }
}

创建性能分析结束行为:

application/common/behavior/XhprofEnd.php

<?php
namespace app\common\behavior;

/**
 * 结束性能分析
 */
class XhprofEnd
{
    public function run($params)
    {
        $xhprof_data = xhprof_disable();
        // display raw xhprof data for the profiler run
        // print_r($xhprof_data);
        // 这里是xhprof的目录 !!!
        $XHPROF_ROOT = realpath(dirname(env('APP_PATH')) . '/../xhprof');
        include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
        include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";
        // save raw data for this profiler run using default
        // implementation of iXHProfRuns.
        $xhprof_runs = new \XHProfRuns_Default();
        // save the run under a namespace "xhprof_foo"
        $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");

        echo '<a href="http://127.0.0.1/xhprof_html/index.php?run=' . $run_id . '&source=xhprof_foo" target="_blank">查看</a>';
    }
}

这样,项目里所有请求都会产生一个性能分析文件,可以通过http://您的域名/xhprof/xhprof_html/index.php 查看。