在PHP中编写(To File)日志记录器的最有效方法是什么?

3
希望这里的某个人能够帮助我 - 基本上,我有一个日志记录类正在更新(很久以前制作),我想确保它在98-99%的情况下记录消息。然而,现在它无法处理exit()s,基本上每次发送消息/错误到日志记录器时,它只是写入文件(打开,写入和关闭)。
什么是处理exit()s的最佳方法,并且在磁盘写入方面高效?现在我正在查看logger类中的__destruct(其中调用了fopen,fwrite和fclose),但我不确定这是否安全或高效。
编辑:set_error_handler()怎么样?我记得多年前读过它非常慢,对于自定义错误/消息(如SQL问题)也不是很好。

那么问题是,如果您在脚本中使用exit()die(),如何调用您的记录器? - N.B.
考虑使用file_put_contents()而不是fopen()fwrite(), fclose()是一个不错的主意。 - CD001
Sean的回答就是你要找的。实现register_shutdown_function应该能帮助你,而不需要改变太多的代码。 - N.B.
附加资源:http://www.nyphp.org/PHundamentals/7_PHP-Error-Handling - Zul
2个回答

6
如果您希望在脚本结束时记录某些东西,您应该查看PHP的register_shutdown_function()函数:
function shutdown()
{
     // .. log code here.
}

register_shutdown_function('shutdown');

为了避免出现不确定的情况,应该避免使用__destruct()方法。

你也可以尝试使用PHP内置的error_log()方法来将内容写入实际的PHP错误日志文件中(这可能比编写自己的日志记录器更可靠)。

参考资料:

http://php.net/manual/zh/function.register-shutdown-function.php

http://php.net/manual/zh/function.error-log.php


此外,为了提高效率,在构造函数中打开文件一次,根据需要执行写操作,并在关闭函数中关闭文件。 - Leigh
谢谢。我想我会在一个类中使用register_shutdown_function,在它的__construct中调用它。这样它只需要被加载就可以被调用,比__destruct更安全。 - Jon

1

我总是使用一些全局函数,例如:

function BeforeExit () {
  //do stuff like logging
  exit;
}

我在header()、die()等之前使用相同的“构造”来保存会话数据、设置(新)cookie数据、记录日志、进行基准测试和其他操作。 - djot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接