如何将PHP文件中定义的PHP函数调用(参数,返回值)记录到数据库中?

时间:2019-01-24 13:31:03

标签: php

我已阅读this previous question。我的问题很相似:要调试某些问题,我需要将对源文件includes/foo.php中的函数的所有调用记录到数据库:

<?php
function f1($arg1, $arg2) {
    return $arg1 . "x" . $arg2;
}
...
function f9($foo, $bar=array(), $baz=0) {
    return array(...);
}

最简单的方法是什么?我曾考虑过将includes/foo.php移至includes/foo.php_orig,重命名该源中的所有函数(例如f1至f1__orig,依此类推),然后放入我自己的包装器includes/foo.php

<?php
include "includes/logger.php";
include "includes/foo.php_orig";
function f1($arg1, $arg2) {
    $res = f1__orig($arg1, $arg2);
    log_fcall(array($arg1, $arg2), $res);
    return $res;
}
...
function f9($foo, $bar=array(), $baz=0) {
    $res = f9__orig($foo, $bar, $baz);
    log_fcall(array($foo, $bar, $baz), $res);
    return $res;
}

但这感觉很繁琐和手动。 PHP是否提供另一种机制?或至少是其他一些缓解痛苦的方法。

1 个答案:

答案 0 :(得分:0)

可以执行此操作的一种方法是使用一些包装魔术和评估程序。这并不是说您应该这样做,因为如果这是用于调试,则有更好的工具,例如debug_baktrace由04FS在评论中提及。此外,根据托管PHP代码的位置,eval可能会被禁用。

包装器将使用预期的函数名称和一个匿名函数,如下所示:

$wrapped = array();

function logWrap($name, $func) {
  global $wrapped;
  $wrappedIndex = count($wrapped);
  $wrapped[] = $func;
  eval(
    "function ${name}() {"
    . "global \$wrapped;"
    . "\$args = func_get_args();"
    . "\$res = call_user_func_array(\$wrapped[${wrappedIndex}], \$args);"
    . "log_fcall(\$args, \$res);"
    . "return \$res;"
    . "}");
}

然后,您可以像这样简单地包装函数:

logWrap("f1", function($arg1, $arg2) {
    return $arg1 . "x" . $arg2;
});