【问题标题】:Is there a way to log automatically the start and end of function definition in PHP?有没有办法在 PHP 中自动记录函数定义的开始和结束?
【发布时间】:2011-07-19 12:23:59
【问题描述】:

我想要一种方法来记录函数调用的开始和结束,而无需显式调用日志对象中的方法。

我知道我们可以使用xdebug 来跟踪流程,但我有一个要求,我必须将函数调用写入日志文件,而无需(有代码)调用$logObj->info('Function call');

例如:

<?php

class something
{
    public function test()
    {
        echo "Test.";
    }
}

$some = new something();
$some->test();

?>

现在,我想在我的out.log 中查看以下条目:

2010-08-03T09:06:15+02:00 ERR (1): Entering something::test()
...
...
2010-08-03T09:06:15+02:00 ERR (1): Leaving something::test()

【问题讨论】:

  • 我不太明白您所说的“我们可以使用xdebug 来跟踪输出”的意思,因此抱歉,如果我要写的内容已经知道的话对您来说,但我们可以使用 xdebug 自动执行分析脚本,而无需对源代码进行任何修改。所有这些都必须完成——xdebug 需要在 php.ini 中配置几行来启用分析器并将分析信息存储在某个目录中。

标签: php oop logging


【解决方案1】:

您可以为您的对象创建一个包装类。

例如:

class LoggingSomethingWrapper {
  protected $something;
  protected $logger;
  function __construct($something, $logger) {
    $this->something = $something;
    $this->logger = $logger;
  }
  public function test() {
    $this->logger->logBefore(__FUNCTION__);
    $result = $this->something->test();
    $this->logger->logAfter(__FUNCTION__);
    return $result;
  }
}

【讨论】:

  • +1 更好的是,他可以在包装器中使用实现魔术方法 __call()、__get() 和 __set()(而不是在您的示例中像 test() 那样显式代理方法,并让它很好而且通用)。
  • @Troelskn 我不是很明白,你能给我一个示例实现吗?
  • @Troelskn 就像@killer_pl 说的那样,我可以使用__call() 来实现它,但它需要很多改变。我想看看有没有办法在不修改代码的情况下实现这一点。
【解决方案2】:

你需要的是 AOP (http://en.wikipedia.org/wiki/Aspect-oriented_programming)

但是PHP本身不支持AOP(有一些扩展,但我不知道它们有多好)。

正如 troelskn 提到的,您应该创建一个包装类(未经测试):

class LogWrapper
{
    protected $object;

    protected $logger;

    public function __construct($object, $logger)
    {
        $this->object = $object;
        $this->logger = $logger;
    }

    public function __call($name, $arguments) 
    {
        //log
        $returnValue = call_user_func_array(array($this->object, $name), $arguments);
        //log

        return $returnValue;
    }
}

【讨论】:

  • 你能给我发一些这些扩展吗??
  • @rakesh 我从来没有使用过它们,只是用谷歌搜索了“php aop”并得到了一堆结果。另外,现在我在sf这里找到了一个话题:stackoverflow.com/questions/4738282/…
  • 有一个纯 PHP 库可以将 AOP 集成到任何现有的 PHP 应用程序中:Go! AOPgithub.com/lisachenko/go-aop-php。它不需要任何 PECL 扩展,既不使用 Runkit 的任何黑魔法也不使用 evals,该库不使用 DI 容器。
【解决方案3】:

您可以在名为 func_xxx 的对象中实现函数。并使用获取参数 xxx 的魔术方法 call(),开始记录,调用 $this->func$xxx() 并完成记录

【讨论】:

  • 是的,这是我最初的想法,但我想看看 PHP 中是否有一些流行的东西我可以使用。
猜你喜欢
  • 2023-02-20
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 2020-03-05
相关资源
最近更新 更多