【问题标题】:Most efficient way of writing a (To File) logger in PHP?用 PHP 编写(到文件)记录器的最有效方法?
【发布时间】:2012-01-24 11:42:18
【问题描述】:

希望这里有人可以帮助我 - 基本上我有一个正在更新的日志记录类(很久以前制作的),我想确保它在 98-99% 的情况下记录消息。但是现在它不处理 exit()s,它基本上只是在每次向记录器发送消息/错误时写入文件(打开、写入和关闭)。

处理 exit() 并在磁盘写入方面高效的最佳方法是什么?现在我正在查看记录器类中的 __destruct(其中调用了 fopen、fwrite 和 fclose),但是我不太确定这是否安全或有效。

编辑:set_error_handler() 呢?我记得几年前读到这很慢,而且对于自定义错误/消息(如 SQL 问题)不是很好

【问题讨论】:

  • 那么问题是如果您在脚本中使用exit()die(),如何调用您的记录器?
  • 也可以考虑file_put_contents() 而不是fopen()fwrite()fclose()
  • 肖恩的答案就是您要找的。实现register_shutdown_function 应该可以帮助您,而无需更改大部分代码。

标签: php logging


【解决方案1】:

如果你想在脚本结束时记录一些东西,你应该看看 PHP 的 register_shutdown_function():

function shutdown()
{
     // .. log code here.
}

register_shutdown_function('shutdown');

您应该避免使用__destruct() 方法,因为无法保证它会在您期望它被调用时被调用。

您还可以查看 PHP 内置的 error_log() 方法,将内容写入实际的 PHP 错误日志文件(这可能比编写自己的记录器更可靠)。

参考资料:

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

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

【讨论】:

  • 除此之外,为了效率,在构造函数中打开文件一次,根据需要执行写入,并在关闭函数中关闭文件。
  • 谢谢。我想我会在一个类中使用 register_shutdown_function,在它的 __construct 中调用。这样它只需要加载就可以调用,并且比 __destruct 更安全。
【解决方案2】:

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

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

【讨论】:

  • 我在 header()、die() 等之前使用相同的“构造”来保存会话数据、设置(新)cookie 数据、进行日志记录、进行基准测试和其他事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多