我正在考虑如何找到调用任何函数的位置。问题是我需要找到 PHP 在哪里调用mail()
函数。一种方法是使用register_tick_function()
,但我需要打开每个文件并检查每一行的内容。这个项目很大,用 PHP 解析每个文件需要很长时间。还有什么办法吗?或选项如何覆盖该mail()
功能?
5 回答
要覆盖内置邮件功能,请查看作为高级 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);
您可以使用 . 检查堆栈跟踪debug_backtrace()
。这将包含有关调用方法/函数等的信息。有关示例,请参见手册。
要将行为添加到现有函数,请将函数包装到您自己的函数或类中,然后调用 this 而不是本机函数。
要完全重新定义本机功能,您必须安装runkit
. 然后你可以这样做runkit_redefine_function()
(或按照其他地方的建议使用 APD)。
如果您只想知道在您的项目mail()
中调用的位置,例如您不需要在运行时评估它,请使用您的 IDE 的搜索功能。Eclipse、Zend Studio 和 Netbeans 可以进行文件搜索,因此应该很容易找到调用并替换它们。
蛮力方法是在您的代码中进行全局搜索和替换,将“mail\s(”替换为“my_mail(”),然后定义 my_mail 并将您想要的任何日志记录功能放在那里。
为什么不简单地搜索“mail(”的来源?
我认为您可以访问源代码?
为什么不直接使用像 jEdit 这样的编辑器,并在所有打开的缓冲区中查找所有出现的 mail(*?
或者你真的需要在运行时知道行号吗?我无法想象你真的会这样做。