在我尝试记录错误和异常时,我的记录器不断被破坏

时间:2009-10-06 04:58:39

标签: php

我刚刚在企业开源Java开发三年后转回PHP。现在我的任务是更新我们的平台以便更好地记录。

我现在更好地理解PHP对象生命周期如何对象何时被垃圾收集并且困住了我的问题。当发生致命错误时,我试图在已经被破坏后调用记录器。我的问题是,我该如何解决这个问题?如何在请求结束之前阻止对象被销毁?

理想情况下,我希望将此记录器保留在内存中,就像在Java中一样,但是PHP甚至可以实现这一点吗?两个不同的线程或请求之间是否有任何共享?

1 个答案:

答案 0 :(得分:3)

使用PHP,每个请求都由不同的进程处理 - 这意味着您无法在请求之间保留一些对象(您可以将其序列化并将其存储在文件或类似的内容中,并取消序列化当另一个请求到来时;但这并不是事情通常的完成方式)

这意味着每次PHP脚本收到请求时,您都必须重新安装记录器。


现在,如果您想在同一个脚本中使用来自几个不同类/方法/函数的记录器,您必须知道PHP中的变量不是“默认”全局:在函数外部声明的变量无法从内部访问一个函数,除非你使用global keyword这样说。


在这种情况下,当您希望应用程序中的任何位置都可以使用特定类(您的记录器)中的一个且只有一个实例时,人们通常会使用Singleton Design Pattern

它允许使用这样的东西:

My_Logger_Class::log('blah');

从代码的任何部分开始,log方法将处理:

  • 如果没有一个现有实例,则实例化该课程
  • 实际记录

而且,是的,第一次为一个HTTP请求调用此方法时,它必须重新打开日志文件(如果记录到文件中)


作为旁注:已经存在一些现有的优秀日志记录组件,例如PEAR::LogZend_Log

也许使用其中一个可能会帮助你花更少的时间重新发明一些轮子?