PHP钩子函数

时间:2011-02-18 18:08:58

标签: php performance hook

我基本上可以这样做:

register_function_hook('myFunctionHook');

所以当运行任何函数时:

functionA(); //The hook runs myFunctionHook();
anoterFunction(); //The hook runs myFunctionHook();
Class::functionA(); //The hook runs myFunctionHook();

这样的事情存在吗?

- 编辑 -

我想要做的是详细了解每个功能的持续时间。 IE浏览器。性能调优。我想知道在我的Apache服务器上没有安装xDebug所需的时间,但我不知道是否可能。

5 个答案:

答案 0 :(得分:5)

可以使用 register_tick_function() ,也可以使用check this comment on the PHP manual

$script_stats = array();
$time = microtime(true);

function track_stats(){
    global $script_stats,$time;
    $trace = debug_backtrace();
    $exe_time = (microtime(true) - $time) * 1000;
    $func_args = implode(", ",$trace[1]["args"]);
    $script_stats[] = array(
        "current_time" => microtime(true),
        "memory" => memory_get_usage(true),
        "file" => $trace[1]["file"].': '.$trace[1]["line"],
        "function" => $trace[1]["function"].'('.$func_args.')',
        "called_by" => $trace[2]["function"].' in '.$trace[2]["file"].': '.$trace[2]["line"],
        "ns" => $exe_time
        );
    $time = microtime(true);
    }

declare(ticks = 1);
register_tick_function("track_stats");

// the rest of your project code

// output $script_stats into a html table or something

这与所有东西“挂钩”,不仅仅是功能,但我认为它符合你的目的。

答案 1 :(得分:3)

不,你不喜欢它

但是你可以用继承来实现目标。

 class Vehicle {
       function __construct() {
              $this->hookFunction();
       }

       function hookFunction() {
              //
       }
 }

 class Car extends Vehicle {

 } 

 Class Toyota extends Car {

 }

 new Toyota(); // will you hook function
 // this exclude static call to member functions, or other inline functions.

答案 2 :(得分:1)

你要找的是个探路者。而PQP看起来像是一个独立的。

答案 3 :(得分:1)

您应该使用真实的Profiler,而不是污染代码,就像xdebug提供的那样

答案 4 :(得分:-1)

不确定主题入门者是否需要这个,但也许其他人仍然可以从中受益。

有一个完全用PHP编写的PHP库,可以让你完全按照自己的意愿行事。

这是一篇关于它是如何工作的文章,包括源代码: http://phpmyweb.net/2012/04/26/write-an-awesome-plugin-system-in-php/

它允许您从要挂钩的类中注册一个函数。所以它基本上首先执行你的代码,然后你确定你的代码执行后你也想调用原始函数。