我正在考虑如何找到调用任何函数的位置。问题是我需要找到PHP调用mail()
函数的位置。一种方法是使用register_tick_function()
,但我需要打开每个文件并检查每行上的内容。该项目非常庞大,在PHP中解析每个文件需要很长时间。还有其他方法吗?或者选择如何覆盖mail()
函数?
答案 0 :(得分:6)
要覆盖内置邮件功能,请查看属于override_function的Advanced 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这样的编辑器,找到所有发生的邮件(*在所有打开的缓冲区中?*
或者你真的需要知道运行时的行号吗?我无法想象你真的这么做。