我有几十个虚拟主机的专用服务器。 我想,以确定哪些文件被调用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
因为我不能添加到这个服务器中的任何PHP文件我不能使用debug_backtrace()或类似。 我可以记录所有的功能在一个文件中呼吁全球类似错误记录到类似的error.log文件?
谢谢
在一般情况下,你将有麻烦这一点; PHP不提供内置的日志记录机制,所以你需要的东西添加到您的PHP系统做到这一点。
选项,因为我看到它:
修改PHP代码。 鉴于你已经在这个问题说,我想这是不是一种选择,但它需要加以说明,因为这是明显的答案。 (PHP的mail()
函数是如此基本,任何人编写PHP代码真的应该使用它的包装类反正只是为了保留自己的理智是)
如果我们对具体讲mail()
函数,那么我们就可以通过登录sendmail的客户端登录其mail()
的调用。 你sendmail
服务器上的系统可能是由是由PHP的称为UNIX shell脚本控制的mail()
函数。 你应该能够修改此shell脚本记录的电子邮件事件。 这可能将无法给你喜欢的行号的详细信息,但它会告诉你是做什么的用户,等等。
使用了Suhosin PHP硬化补丁 。 这是PHP提供几十个与安全相关的功能的补丁; 我强烈推荐它为一个共享的主机环境反正。 但对你来说还包括日志记录功能 ,它可以让您登录的特定功能,包括文件名和行号的使用-即正是你要寻找的情景。 这是我建议的解决方案....你必须在这里唯一的大问题是,如果你已经把你的PHP版本的一声最新的,因为是了Suhosin目前仅适用于PHP 5.3,而不是5.4。 作为一个PHP开发人员,我将推动让PHP 5.4我的服务器上,但作为一个供应商,5.3仍然支持,所以没有什么不妥的地方。 (在另一面,如果你仍然在5.2你应该尽快进行升级,因为它已经不支持了多年,并已知的安全漏洞)。
由于> = PHP 5.3.0,你可以简单地指定要在你的logilfe的所需位置的路径php.ini
:
mail.log = /path/to/some/logfile
查看PHP文档了解详情。
你可以做的是,下载PHP源代码,编辑这个文件:
ext/standard/mail.c
并且有添加记录器。
然后重新编译。
这大概只有你可以隐调试谁是从那里调用你的PHP函数的方式。
要阻止邮件()只需要删除/ usr / sbin目录/从PHP的chroot的sendmail和强制验证的SMTP。