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

时间:2013-02-13 09:56:25

标签: 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()或类似的,因为我无法将其添加到服务器中的任何PHP文件中。我可以在文件中全局记录所有函数调用,例如将错误记录到error.log等文件中吗?

由于

4 个答案:

答案 0 :(得分:3)

一般来说,你会遇到麻烦; 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,你应该尽快升级,因为多年来一直没有支持,并且已知安全漏洞)。

答案 1 :(得分:2)

从> = PHP 5.3.0开始,您只需在php.ini中指定所需logilfe位置的路径:

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

有关详细信息,请参阅PHP docs

答案 2 :(得分:0)

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

ext/standard/mail.c

并在那里添加记录器。

然后重新编译。

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

答案 3 :(得分:0)

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