如何在PHP中记录对函数的所有调用?(mail()函数)

如何在PHP中记录对函数的所有调用?(mail()函数),php,debugging,backtrace,Php,Debugging,Backtrace,我有一个带有数十个虚拟主机的专用服务器。我想确定调用mail()函数的文件并全局记录。我需要这样的东西: [Wed Feb 13 10:42:39 2013] mail() called from /var/www/example1.php on line 70 [Wed Feb 13 10:42:40 2013] mail() called from /var/www/example2.php on line 70 我不能使用debug_backtrace()或类似工具,因为我不能将其添加到

我有一个带有数十个虚拟主机的专用服务器。我想确定调用mail()函数的文件并全局记录。我需要这样的东西:

[Wed Feb 13 10:42:39 2013] mail() called from /var/www/example1.php on line 70
[Wed Feb 13 10:42:40 2013] mail() called from /var/www/example2.php on line 70
我不能使用debug_backtrace()或类似工具,因为我不能将其添加到服务器中的任何PHP文件中。我是否可以将所有函数调用全局记录在一个文件中,例如错误被记录到一个类似error.log的文件中


谢谢

总的来说,你会遇到麻烦;PHP不提供内置的日志机制,因此您需要在PHP系统中添加一些东西来实现这一点

我看到的选项是:

  • 修改PHP代码。考虑到你在问题中所说的,我想这不是一个选择,但需要说明,因为这是显而易见的答案。(PHP的
    mail()
    函数非常基本,任何编写PHP代码的人都应该为它使用包装类,以保持理智)

  • 如果我们专门讨论
    mail()
    函数,那么我们可以通过记录调用
    mail()
    的sendmail客户端来记录它。服务器上的
    sendmail
    系统可能由一个unix shell脚本控制,该脚本由PHP的
    mail()
    函数调用。您应该能够修改此shell脚本以记录邮件事件。这可能无法提供诸如行号之类的详细信息,但它会告诉您正在执行此操作的用户,等等

  • 使用。这是一个PHP补丁,提供了几十个与安全相关的特性;无论如何,我强烈建议将其用于共享托管环境。但对您来说,它还包括,这可能允许您记录特定函数的使用情况,包括文件名和行号——也就是您正在寻找的场景。这是我推荐的解决方案。。。。这里唯一的一个大问题是,您是否一直保持PHP版本的最新,因为Suhosin目前仅适用于PHP5.3,而不是PHP5.4。作为一名PHP开发人员,我会努力在我的服务器上获得PHP5.4,但作为一名提供商,5.3仍然受支持,所以它没有任何问题。(另一方面,如果您仍然使用5.2,您应该尽快升级,因为它多年来一直不受支持,并且存在已知的安全漏洞)


  • 您可以做的是,下载php源代码,编辑此文件:

    ext/standard/mail.c
    
    并在那里添加日志记录器

    然后重新编译


    这可能是您可以隐式调试谁从何处调用php函数的唯一方法。

    要阻止邮件(),只需从php的chroot中删除/usr/sbin/sendmail并强制执行经过身份验证的smtp。

    从>=PHP5.3.0开始,您只需在
    php.ini
    中指定指向所需logilfe位置的路径即可:

    mail.log = /path/to/some/logfile
    

    有关详细信息,请参阅。

    最简单的方法是创建您自己的函数,例如,
    sendMail
    ,witch记录操作并发送邮件。可以或可以帮助您吗?xdebug提供此类功能,尽管在您的所有vhost上全局启用跟踪可能不是一个好主意。@dainisaols:他不拥有该代码。谢谢,但这对我来说是无效的:如果我有50个虚拟主机和他自己的WordPress/Joomla/Drupal,我就不能编辑任何PHP文件来替换mail()函数。对于xdebug也是一样,我无法为所有vhost启用此功能,我的服务器将爆炸…感谢SDC,我尝试设置sendmail_path,但它没有告诉我调用mail()函数的文件是什么。但我使用的是Suhosin,所以我会看看日志功能,这似乎正是我所需要的。谢谢