【问题标题】:How to log all calls to a function in PHP? (mail() function)如何记录对 PHP 中函数的所有调用? (邮件()函数)
【发布时间】:2013-02-13 09:56:24
【问题描述】:

我有一个带有数十个虚拟主机的专用服务器。我想确定哪个文件正在调用 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 之类的文件中吗?

谢谢

【问题讨论】:

  • 最简单的方法是创建自己的函数,例如,sendMail,女巫记录操作并发送邮件。
  • 可以xdebug.orgcode.google.com/p/webgrind帮助你吗?
  • xdebug 提供了这样的功能,尽管在所有虚拟主机上全局启用跟踪在性能方面可能不是一个好主意。
  • @DainisAbols:他不拥有代码。
  • 谢谢,但这对我无效:如果我有 50 个虚拟主机和他自己的 WordPress/Joomla/Drupal 我不能编辑任何 PHP 文件来替换 mail() 函数。 xdebug 也是一样,我不能为所有虚拟主机启用这个,我的服务器会爆炸......

标签: php debugging backtrace


【解决方案1】:

一般来说,你会遇到麻烦; PHP 没有提供内置的日志记录机制,因此您需要在 PHP 系统中添加一些内容才能做到这一点。

我看到的选项:

  1. 修改 PHP 代码。鉴于您在问题中所说的话,我想这不是一个选择,但需要说明,因为这是显而易见的答案。 (PHP 的 mail() 函数非常基础,以至于任何编写 PHP 代码的人都应该为它使用包装类,以保持他们的理智)

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

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

【讨论】:

  • 感谢 SDC,我尝试设置 sendmail_path 但它没有告诉我什么文件正在调用 mail() 函数。但是我正在使用 Suhosin,所以会看看日志记录功能,这似乎正是我所需要的。谢谢!
【解决方案2】:

从 >= PHP 5.3.0 开始,您可以简单地在 php.ini 中指定到您的 logilfe 所需位置的路径:

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

详情请参阅PHP docs

【讨论】:

  • 太好了,谢谢!我多年来一直忽略这一点。
【解决方案3】:

你可以做的是,下载php源代码,编辑这个文件:

ext/standard/mail.c

并在那里添加记录器。

然后重新编译。

这可能是你可以隐式调试谁从哪里调用你的 php 函数的唯一方法。

【讨论】:

    【解决方案4】:

    要阻止 mail(),只需从 php 的 chroot 中删除 /usr/sbin/sendmail 并强制验证 smtp。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 2015-10-15
      • 2017-06-03
      • 2015-06-09
      • 2010-12-25
      相关资源
      最近更新 更多