3

我正在考虑如何找到调用任何函数的位置。问题是我需要找到 PHP 在哪里调用mail()函数。一种方法是使用register_tick_function(),但我需要打开每个文件并检查每一行的内容。这个项目很大,用 PHP 解析每个文件需要很长时间。还有什么办法吗?或选项如何覆盖该mail()功能?

4

5 回答 5

6

要覆盖内置邮件功能,请查看作为高级 PHP 调试器 PECL 扩展的一部分的override_function - 然后您可以使用 debug_backtrace 找出调用者详细信息...

//define code to override mail function (note I've used php5.3 nowdoc syntax to avoid 
//the need to escape the dollar symbols!!
$code=<<<'CODE'
    $trace=debug_backtrace();
    $caller=array_shift($trace);

    echo 'mail() called by '.$caller['function']
    if (isset($caller['class']))
        echo 'in '.$caller['class'];
CODE;

//install override
override_function('mail', '$to,$subject,$msg,$hdrs,$params', $code);
于 2010-01-14T09:19:41.627 回答
3

您可以使用 . 检查堆栈跟踪debug_backtrace()。这将包含有关调用方法/函数等的信息。有关示例,请参见手册。

要将行为添加到现有函数,请将函数包装到您自己的函数或类中,然后调用 this 而不是本机函数。

要完全重新定义本机功能,您必须安装runkit. 然后你可以这样做runkit_redefine_function()(或按照其他地方的建议使用 APD)。

如果您只想知道在您的项目mail()中调用的位置,例如您不需要在运行时评估它,请使用您的 IDE 的搜索功能。Eclipse、Zend Studio 和 Netbeans 可以进行文件搜索,因此应该很容易找到调用并替换它们。

于 2010-01-14T09:19:36.960 回答
2

蛮力方法是在您的代码中进行全局搜索和替换,将“mail\s(”替换为“my_mail(”),然后定义 my_mail 并将您想要的任何日志记录功能放在那里。

于 2010-01-14T09:23:39.567 回答
1

为什么不简单地搜索“mail(”的来源?

于 2010-01-14T09:24:42.550 回答
0

我认为您可以访问源代码?

为什么不直接使用像 jEdit 这样的编辑器,并在所有打开的缓冲区中查找所有出现的 mail(*?

或者你真的需要在运行时知道行号吗?我无法想象你真的会这样做。

于 2010-01-14T09:25:27.340 回答