PHP - 识别调用函数的时间

时间:2010-01-14 09:15:08

标签: php debugging override nowdoc

我正在考虑如何找到调用任何函数的位置。问题是我需要找到PHP调用mail()函数的位置。一种方法是使用register_tick_function(),但我需要打开每个文件并检查每行上的内容。该项目非常庞大,在PHP中解析每个文件需要很长时间。还有其他方法吗?或者选择如何覆盖mail()函数?

5 个答案:

答案 0 :(得分:6)

要覆盖内置邮件功能,请查看属于override_functionAdvanced PHP Debugger PECL extension - 然后您可以使用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);

答案 1 :(得分:3)

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

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

要完全重新定义原生函数,您必须安装runkit。然后你可以做runkit_redefine_function()(或按照别处的建议使用APD)。

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

为什么不直接在源代码中搜索“mail(”?

答案 4 :(得分:0)

我认为你有权访问源代码?

为什么不使用像jEdit这样的编辑器,找到所有发生的邮件(*在所有打开的缓冲区中?*

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