2013-02-13 94 views
8

我有一个拥有数十个虚拟主机的专用服务器。我想确定哪个文件正在调用mail()函数并将其记录到全局。我需要类似的东西:如何在PHP中记录所有调用函数? (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这样的文件?

谢谢

+1

最简单的方法是创建自己的函数,比如'sendMail',巫婆记录动作和发送邮件。 – Peon 2013-02-13 09:59:11

+0

可以http://xdebug.org/或http://code.google.com/p/webgrind/帮助你吗? – Stephan 2013-02-13 10:00:05

+1

xdebug提供了这样的功能,尽管在所有虚拟主机上全局启用跟踪可能不是一个好主意。 – Jon 2013-02-13 10:01:56

回答

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上,你应该尽快升级,因为它已经不被支持多年并且存在已知的安全漏洞)。

+0

谢谢SDC,我试图设置sendmail_path,但它不告诉我什么文件调用mail()函数。但是我使用的是Suhosin,所以会看一下记录功能,看起来正是我所需要的。谢谢! – Jose 2013-02-13 10:31:45

0

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

ext/standard/mail.c 

,并添加记录那里。

然后重新编译。

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

0

阻止邮件()只是从PHP的chroot中删除/ usr/sbin/sendmail并强制验证smtp。

2

截至> = PHP 5.3。0,则只需在您的php.ini指定您logilfe的所需位置的路径:

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

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